无法使用 Paths.get() 从 Maven 资源加载文件
Not able to load file from Maven resources with Paths.get()
对于这个看似简单而且几乎是愚蠢的问题,我深表歉意,但我花了很多时间来解决它,但没有成功。
我创建了一个非常简单的 Maven 项目,然后在 src/resources
文件夹中创建了一个简单的文本文件,如下所示。
pom.xml 很简单。 App
class 看起来像这样:
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
这似乎是一个非常愚蠢的问题,但我就是无法理解它。真诚感谢任何帮助。
请检查您的 test.txt 路径。您正在尝试访问您的文件,就像它与您的 Main class 在同一文件夹中一样。如果您想访问您的文件,您应该使用正确的相对路径。
您正在使用 Maven,并且您要加载的文本文件已正确放置在 class 路径中:src/main/resources
。问题是 Paths.get("test.txt")
不在 class 路径中而是在文件系统中搜索文件。
所以您需要的是从 class 路径获取资源作为 URI 并将其传递给 Paths.get(URI)
:
Path textFile = Paths.get(App.class.getResource("/test.txt").toURI());
Files.lines(textFile).forEach(System.out::println);
请注意,Path
的获取方式非常复杂。
不幸的是,Class
class 未更新以利用 Java 7.
中引入的 java nio API
如果我们可以这样写,那就真的更简单了:
Files.lines(App.class.getResourcePath("/test.txt"))
.forEach(System.out::println);
对于这个看似简单而且几乎是愚蠢的问题,我深表歉意,但我花了很多时间来解决它,但没有成功。
我创建了一个非常简单的 Maven 项目,然后在 src/resources
文件夹中创建了一个简单的文本文件,如下所示。
pom.xml 很简单。 App
class 看起来像这样:
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
这似乎是一个非常愚蠢的问题,但我就是无法理解它。真诚感谢任何帮助。
请检查您的 test.txt 路径。您正在尝试访问您的文件,就像它与您的 Main class 在同一文件夹中一样。如果您想访问您的文件,您应该使用正确的相对路径。
您正在使用 Maven,并且您要加载的文本文件已正确放置在 class 路径中:src/main/resources
。问题是 Paths.get("test.txt")
不在 class 路径中而是在文件系统中搜索文件。
所以您需要的是从 class 路径获取资源作为 URI 并将其传递给 Paths.get(URI)
:
Path textFile = Paths.get(App.class.getResource("/test.txt").toURI());
Files.lines(textFile).forEach(System.out::println);
请注意,Path
的获取方式非常复杂。
不幸的是,Class
class 未更新以利用 Java 7.
中引入的 java nio API
如果我们可以这样写,那就真的更简单了:
Files.lines(App.class.getResourcePath("/test.txt"))
.forEach(System.out::println);