Не удалось загрузить файл из ресурсов 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. Вы пытаетесь получить доступ к своему файлу, как будто он находится в одной папке с вашим основным классом. Вы должны использовать правильный относительный путь, если вы хотите получить доступ к вашему файлу.