Как загрузить файл из папки ресурсов?



мой проект имеет следующую структуру:



/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 для создания своего проекта.

811   11  

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
}

Примечания

  1. видеть на Издателя Машина.
  2. и в GitHub.

попробуй:

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.ТТФ

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;
}

Он работал для меня, и надеюсь, что весь исходный код также поможет вам, наслаждайтесь!

работает ли код, когда не выполняется 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")));
    }
}

Я решил эту проблему путем добавления мой Java Build Path

enter image description here

Я получаю его для работы без какой-либо ссылки на "класс" или "загрузчик классов".

допустим, у нас есть три сценария с расположением файла 'пример.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

    Ничего не найдено.