Как загрузить файл из папки ресурсов?
мой проект имеет следующую структуру:
/src/main/java/
/src/main/resources/
/src/test/java/
/src/test/resources/
у меня есть файл в /src/test/resources/test.csv и я хочу загрузить файл из модульного теста в /src/test/java/MyTest.java
у меня есть этот код, который не работал. Он жалуется "нет такого файла или каталога".
BufferedReader br = new BufferedReader (new FileReader(test.csv))
Я тоже пробовал этот
InputStream is = (InputStream) MyTest.class.getResourcesAsStream(test.csv))
это тоже не сработает. Он возвращает null. Я использую Maven для создания своего проекта.
11 ответов:
попробуйте следующее:
ClassLoader classloader = Thread.currentThread().getContextClassLoader(); InputStream is = classloader.getResourceAsStream("test.csv");
если выше не работает, различные проекты были добавлены в следующий класс:
ClassLoaderUtil1 (код здесь).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 }
Примечания
попробуй:
InputStream is = MyTest.class.getResourceAsStream("/test.csv");IIRC
getResourceAsStream()по умолчанию относится к пакету класса.
вот одно быстрое решение с использованием гуавы:
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)
попробуйте проточные коды на весеннем проекте
ClassPathResource resource = new ClassPathResource("fileName"); InputStream inputStream = resource.getInputStream();или на не весеннем проекте
ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource("fileName").getFile()); InputStream inputStream = new FileInputStream(file);
ClassLoader loader = Thread.currentThread().getContextClassLoader(); InputStream is = loader.getResourceAsStream("test.csv");Если вы используете context ClassLoader для поиска ресурса, то определенно это будет стоить производительности приложения.
теперь я иллюстрирую исходный код для чтения шрифта из каталога Maven created resources,
scr / main/resources / calibril.ТТФ
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; }Он работал для меня, и надеюсь, что весь исходный код также поможет вам, наслаждайтесь!
работает ли код, когда не выполняется Maven-build jar, например, при запуске из вашей IDE? Если это так, убедитесь, что файл действительно включен в банку. Папка ресурсов должна быть включена в файл pom, в
<build><resources>.
следующий класс может быть использован для загрузки
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; } }
getResource () отлично работал с файлами ресурсов, размещенными в
src/main/resourcesтолько. Чтобы получить файл, который находится по пути, отличному отsrc/main/resourcesсказатьsrc/test/javaвам нужно создать его exlicitly.следующий пример может помочь вам
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"))); } }
Я получаю его для работы без какой-либо ссылки на "класс" или "загрузчик классов".
допустим, у нас есть три сценария с расположением файла 'пример.file ' и ваш рабочий каталог (где выполняется ваше приложение) - home/mydocuments/program/projects / myapp:
a) потомок вложенной папки в рабочий каталог: myapp/res/files / пример.файл
b) подпапка не потомок рабочего каталога: проекты/файлы/пример.файл
b2) еще одна подпапка не потомок рабочего каталога: программа / файлы / пример.файл
c) корневая папка: главная/mydocuments/files / example.файл (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));


Comments