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

时间:2015-12-15 13:26:37

标签: java file maven jar path

我有一个Maven项目,我在while (i < MAX_I){ if (array[i+1] == array[i] || array[i-1] == array[i]){ Do Something} i += 2; } while (J < MAX_J){ if (array[j+1] == array[j] || array[j-1] == array[j]){ Do Something} i += 2; } 中有一个类SomeClass,它应该读出位于src/main/java的文件。

这是我的第一个方法:

src/main/resources

在Eclipse控制台上运行时可以正常工作,但是当我在Windows控制台上执行jar文件(由Maven生成)时,它就没有了(抛出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); } } )。

我认为它与文件路径有关,因此我将代码更改为:

IOException

这适用于Eclipse和Windows控制台。但显然这不会在另一台机器上工作。

搜索后,我已将静态方法更改为非静态方法,并使用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); } } 获取文件:

ClassLaoder

这个可以在Eclipse控制台上运行,当我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); } } 时它打印出正确的路径。但它并不适用于Windows控制台。执行jar文件时,我得到了这个:

System.out.println(file.getPath)

所以,故事剪切简短:如何指定文件路径,以便Maven构建生成的jar文件正确执行,独立于它运行的平台?

1 个答案:

答案 0 :(得分:6)

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