我有一个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文件正确执行,独立于它运行的平台?
答案 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);
}