Как загрузить файл из папки ресурсов?
Мой проект имеет следующую структуру:
/src/main/java/
/src/main/resources/
/src/test/java/
/src/test/resources/
У меня есть файл в /src/test/resources/test.csv
, и я хочу загрузить файл из unit test в /src/test/java/MyTest.java
У меня есть этот код, который не работает. Он жалуется "Нет такого файла или каталога".
BufferedReader br = new BufferedReader (new FileReader(test.csv))
Я также пробовал это
InputStream is = (InputStream) MyTest.class.getResourcesAsStream(test.csv))
Это также не работает. Он возвращает null
. Я использую Maven для создания моего проекта.
Ответы
Ответ 1
Попробуйте следующее:
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream is = classloader.getResourceAsStream("test.csv");
Если вышеупомянутое не работает, к различным проектам был добавлен следующий класс: ClassLoaderUtil
1 (код здесь). 2
Вот несколько примеров использования этого класса:
src\main\java\com\company\test\YourCallingClass.java
src\main\java\com\opensymphony\xwork2\util\ClassLoaderUtil.java
src\main\resources\test.csv
// java.net.URL
URL url = ClassLoaderUtil.getResource("test.csv", YourCallingClass.class);
Path path = Paths.get(url.toURI());
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
// java.io.InputStream
InputStream inputStream = ClassLoaderUtil.getResourceAsStream("test.csv", YourCallingClass.class);
InputStreamReader streamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
BufferedReader reader = new BufferedReader(streamReader);
for (String line; (line = reader.readLine()) != null;) {
// Process line
}
Заметки
- Смотрите это в The Wayback Machine.
- Также в GitHub.
Ответ 2
Try:
InputStream is = MyTest.class.getResourceAsStream("/test.csv");
IIRC getResourceAsStream()
по умолчанию относится к пакету класса.
Ответ 3
Вот одно быстрое решение с использованием Guava:
import com.google.common.base.Charsets;
import com.google.common.io.Resources;
public String readResource(final String fileName, Charset charset) throws IOException {
return Resources.toString(Resources.getResource(fileName), charset);
}
Использование:
String fixture = this.readResource("filename.txt", Charsets.UTF_8)
Ответ 4
Попробуйте проточные коды в проекте Spring
ClassPathResource resource = new ClassPathResource("fileName");
InputStream inputStream = resource.getInputStream();
Или в проекте Spring
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("fileName").getFile());
InputStream inputStream = new FileInputStream(file);
Ответ 5
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream is = loader.getResourceAsStream("test.csv");
Если вы используете контекст ClassLoader для поиска ресурса, то, безусловно, это будет стоить производительности приложения.
Ответ 6
Теперь я иллюстрирую исходный код для чтения шрифта из каталога созданных Maven ресурсов,
экр/основные/ресурсы/calibril.ttf
![enter image description here]()
Font getCalibriLightFont(int fontSize){
Font font = null;
try{
URL fontURL = OneMethod.class.getResource("/calibril.ttf");
InputStream fontStream = fontURL.openStream();
font = new Font(Font.createFont(Font.TRUETYPE_FONT, fontStream).getFamily(), Font.PLAIN, fontSize);
fontStream.close();
}catch(IOException | FontFormatException ief){
font = new Font("Arial", Font.PLAIN, fontSize);
ief.printStackTrace();
}
return font;
}
Это сработало для меня и надеюсь, что весь исходный код также поможет вам, Наслаждайтесь!
Ответ 7
Импортируйте следующее:
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.util.ArrayList;
Следующий метод возвращает файл в ArrayList of Strings:
public ArrayList<String> loadFile(String filename){
ArrayList<String> lines = new ArrayList<String>();
try{
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = classloader.getResourceAsStream(filename);
InputStreamReader streamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
BufferedReader reader = new BufferedReader(streamReader);
for (String line; (line = reader.readLine()) != null;) {
lines.add(line);
}
}catch(FileNotFoundException fnfe){
// process errors
}catch(IOException ioe){
// process errors
}
return lines;
}
Ответ 8
Работает ли код, когда не запущен баннер Maven-build, например, при запуске из вашей среды IDE? Если да, убедитесь, что файл фактически включен в банку. Папка ресурсов должна быть включена в файл pom в <build><resources>
.
Ответ 9
Следующий класс можно использовать для загрузки resource
из classpath
, а также получить сообщение об ошибке установки в случае возникновения проблемы с данным filePath
.
import java.io.InputStream;
import java.nio.file.NoSuchFileException;
public class ResourceLoader
{
private String filePath;
public ResourceLoader(String filePath)
{
this.filePath = filePath;
if(filePath.startsWith("/"))
{
throw new IllegalArgumentException("Relative paths may not have a leading slash!");
}
}
public InputStream getResource() throws NoSuchFileException
{
ClassLoader classLoader = this.getClass().getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream(filePath);
if(inputStream == null)
{
throw new NoSuchFileException("Resource file not found. Note that the current directory is the source folder!");
}
return inputStream;
}
}
Ответ 10
getResource() отлично работал с файлами ресурсов, размещенными только в src/main/resources
. Чтобы получить файл, который находится на пути, отличном от src/main/resources
say src/test/java
, вам нужно создать его неявно.
приведенный ниже пример может помочь вам
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
public class Main {
public static void main(String[] args) throws URISyntaxException, IOException {
URL location = Main.class.getProtectionDomain().getCodeSource().getLocation();
BufferedReader br = new BufferedReader(new FileReader(location.getPath().toString().replace("/target/classes/", "/src/test/java/youfilename.txt")));
}
}
Ответ 11
Я решил эту проблему, добавив папку /scr/main/resources
в мой Java Build Path
![enter image description here]()
Ответ 12
Я получил его работать как на работающем jar, так и в IDE, написав
InputStream schemaStream = ProductUtil.class.getClassLoader().getResourceAsStream(jsonSchemaPath);
byte[] buffer = new byte[schemaStream.available()];
schemaStream.read(buffer);
File tempFile = File.createTempFile("com/package/schema/testSchema", "json");
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
out.write(buffer);
Ответ 13
Я столкнулся с той же проблемой. Читать файл из /src/main/resources/
maven вызвал проблему fooobar.com/questions/17495109/...
mvn clean install
Таким образом, файлы, которые вы добавили в папку ресурсов, попадут в сборку maven и станут доступны для приложения.
Я хотел бы сохранить свой ответ: он не объясняет, как читать файл (другие ответы объясняют это), он отвечает, почему InputStream
или resource
был нулевым.
Ответ 14
В Kotlin вы могли бы сделать
fun getJsonFromRessources(jsonPath: String): String? {
return Thread.currentThread().contextClassLoader
.getResourceAsStream(jsonPath)
.bufferedReader()
.use { it.readText() }
}
Ответ 15
Для Java после 1,7
List<String> lines = Files.readAllLines(Paths.get(getClass().getResource("test.csv").toURI()));
Ответ 16
Я получаю его для работы без ссылки на "class" или "ClassLoader".
Скажем, у нас есть три сценария с расположением файла "example.file" и вашего рабочего каталога (где выполняется ваше приложение) - home/mydocuments/program/projects/myapp:
a) Поток дочерней папки в рабочий каталог:
MyApp/RES/файлы/example.file
b) Подпапка, не являющаяся потомком рабочего каталога:
проекты/файлы/example.file
b2) Другая подпапка, не входящая в рабочий каталог:
Программа/файлы/example.file
c) Корневая папка:
home/mydocuments/files/example.file(Linux; в Windows заменить home/c:)
1) Получите правильный путь:
а) String path = "res/files/example.file";
б) String path = "../projects/files/example.file"
b2) String path = "../../program/files/example.file"
в) String path = "/home/mydocuments/files/example.file"
В принципе, если это корневая папка, запустите имя пути с помощью косой черты.
Если это подпапка, не должно быть косой черты перед именем пути. Если подпапка не является потомком к рабочему каталогу, к которому вы должны подключиться, используя "../". Это сообщает системе, чтобы она поднималась в одну папку.
2) Создайте объект File, передав правильный путь:
File file = new File(path);
3) Теперь вам хорошо идти:
BufferedReader br = new BufferedReader(new FileReader(file));