我有,我有一个一流的Maven项目SomeClass
中src/main/java
是应该读出位于文件src/main/resources
.
这是我的第一个方法:
private static void someMethod() { // ... [context] ... String fileName = "src/main/resources/some_file.txt"; for(String line : Files.readAllLines(Paths.get(fileName))) { System.out.println(line); } }
这在Eclipse控制台上运行时工作正常,但是当我在Windows控制台上执行jar文件(由Maven生成)时(它IOException
被抛出)它不会.
我认为它与文件路径有关,所以我将代码更改为:
private static void someMethod() { // ... [context] ... String fileName = "C:/Users/.../workspace/.../src/main/resources/some_file.txt"; for(String line : Files.readAllLines(Paths.get(fileName))) { System.out.println(line); } }
这适用于Eclipse和Windows控制台.但显然这不适用于另一台机器.
在搜索时我将静态方法更改为非静态方法,并用于ClassLaoder
获取文件:
private void someMethod() { // ... [context] ... ClassLoader cL = getClass().getClassLoader(); File file = new File(cL.getResource("some_file.txt").getFile()); for(String line : Files.readAllLines(Paths.get(file.getPath()))) { // or getAbsolutePath() System.out.println(line); } }
这个可以在Eclipse控制台上运行,当我System.out.println(file.getPath)
打印出正确的路径时.但它在Windows控制台上不起作用.执行jar文件时,我得到了这个:
Exception in thread "main" java.nio.file.InvalidPathException: Illegal char <:> at index 4: file:\C:\Users\...\target\...-SNAPSHOT.jar!\some_file.txt at sun.nio.fs.WindowsPathParser.normalize(Unknown Source) at sun.nio.fs.WindowsPathParser.parse(Unknown Source) at sun.nio.fs.WindowsPathParser.parse(Unknown Source) at sun.nio.fs.WindowsPath.parse(Unknown Source) at sun.nio.fs.WindowsFileSystem.getPath(Unknown Source) at java.io.File.toPath(Unknown Source) ...
因此,长的故事砍短:我怎么可以指定文件路径,这样在Maven构建产生的JAR文件正确执行,独立它的运行平台的?
由于您尝试从类路径资源(即不在文件系统中但嵌入在jar中的资源,如所示src/main/resources
)中读取,因此您无法使用Files.lines
.Java NIO.2 Path
不能用于JAR内的资源.
你需要使用一个InputStream
代替.要读取文件中的所有行,可以将其包装成BufferedReader
.假设此代码在类中SomeClass
,您可以使用以下代码(Java 8):
try (BufferedReader br = new BufferedReader(new InputStreamReader(SomeClass.class.getResourceAsStream("/some_file.txt")))) { br.lines().forEach(System.out::println); }