Reputation: 1191
I apologize for this seemingly easy and almost a stupid question, but I have spent a lot of time to fix it without much success.
I created a very simple maven project and then a simple text file inside the src/resources
folder like this.
pom.xml is simple. The App
class looks like this:
public class App {
public static void main(String[] args) throws IOException {
Files.lines(Paths.get("test.txt")).forEach(System.out::println);
}
}
And the exception that I get:
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
This seems to be a very stupid problem but I just can't get my head around it. Any help is sincerely appreciated.
Upvotes: 3
Views: 3779
Reputation: 1114
Please check your test.txt path. You are trying to access your file like it is in the same folder with your Main class. You should be using the correct relative path if you want to access your file.
Upvotes: 0
Reputation: 131496
You are using Maven and the text file that you want to load is correctly placed to be in the classpath : src/main/resources
. The problem is that Paths.get("test.txt")
doesn't search the file in the classpath but in the filesystem.
So what you need is getting the resource from the classpath as a URI and to pass it to Paths.get(URI)
:
Path textFile = Paths.get(App.class.getResource("/test.txt").toURI());
Files.lines(textFile).forEach(System.out::println);
Note that the way to get the Path
is really convoluted.
Unfortunately the Class
class was not updated to take advantage of the java nio API that was introduced in Java 7.
It would be really simpler if we could write something like :
Files.lines(App.class.getResourcePath("/test.txt"))
.forEach(System.out::println);
Upvotes: 9