Не удалось загрузить файл из ресурсов Maven с помощью Paths.get()

Я прошу прощения за этот, казалось бы, простой и почти глупый вопрос, но я потратил много времени, чтобы исправить его без особого успеха.

Я создал очень простой проект Maven, а затем простой текстовый файл внутри src/resources папка такая.

pom.xml прост. App класс выглядит так:

public class App {
    public static void main(String[] args) throws IOException {
        Files.lines(Paths.get("test.txt")).forEach(System.out::println);
    }
}

И исключение, которое я получаю:

Exception in thread "main" java.nio.file.NoSuchFileException: test.txt
    at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
    at sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:230)
    at java.nio.file.Files.newByteChannel(Files.java:361)
    at java.nio.file.Files.newByteChannel(Files.java:407)
    at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384)
    at java.nio.file.Files.newInputStream(Files.java:152)
    at java.nio.file.Files.newBufferedReader(Files.java:2784)
    at java.nio.file.Files.lines(Files.java:3744)
    at java.nio.file.Files.lines(Files.java:3785)
    at com.rahul.App.main(App.java:12)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

Process finished with exit code 1

Кажется, это очень глупая проблема, но я просто не могу разобраться с этим. Любая помощь искренне ценится.

2 ответа

Решение

Вы используете Maven, и текстовый файл, который вы хотите загрузить, правильно помещен в путь к классам: src/main/resources, Проблема в том, что Paths.get("test.txt") не ищет файл в пути к классам, но в файловой системе.

Итак, вам нужно получить ресурс из classpath в виде URI и передать его Paths.get(URI):

Path textFile = Paths.get(App.class.getResource("/test.txt").toURI());
Files.lines(textFile).forEach(System.out::println);

Обратите внимание, что способ получить Path действительно запутанный.
К сожалению Class класс не был обновлен, чтобы воспользоваться API Java Java, который был представлен в Java 7.
Было бы действительно проще, если бы мы могли написать что-то вроде:

Files.lines(App.class.getResourcePath("/test.txt"))
     .forEach(System.out::println);

Пожалуйста, проверьте ваш путь test.txt. Вы пытаетесь получить доступ к своему файлу, как будто он находится в одной папке с вашим основным классом. Вы должны использовать правильный относительный путь, если вы хотите получить доступ к вашему файлу.

Другие вопросы по тегам