当前位置:  开发笔记 > 编程语言 > 正文

指定使用jar文件的通用文件路径

如何解决《指定使用jar文件的通用文件路径》经验,为你挑选了1个好方法。

我有,我有一个一流的Maven项目SomeClasssrc/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文件正确执行,独立它的运行平台的?



1> Tunaki..:

由于您尝试从类路径资源(即不在文件系统中但嵌入在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);
}

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有