public class Main {
public static void main(String[] args) throws IOException {
System.out.println("----------Start------------------");
URL resource = Main.class.getClassLoader().getResource("test.txt");
System.out.println("resource: "+ resource.getPath());
File file = new File(resource.getPath());
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
System.out.println("----------End------------------");
}
}
如果我从IDEA运行此代码 - 所有工作
----------Start------------------
resource: /D:/javaHz/target/classes/test.txt
1
2
3
4
5
----------End------------------
处理完成,退出代码为0
如果我从java -jar重新开始 - 我收到错误
D:\hz>java -jar hzTest-jar-with-dependencies.jar
----------Start------------------
resource: file:/D:/hz/hzTest-jar-with-dependencies.jar!/test.txt
Exception in thread "main" java.io.FileNotFoundException: D:\hz\file:\D:\hz\hzTe st-jar-with-dependencies.jar!\test.txt (Syntax error in file name, folder name, or volume label)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at java.io.FileReader.<init>(FileReader.java:58)
at test.Main.main(Main.java:15)
我不想使用getResourceAsStream
答案 0 :(得分:2)
new File(resource.getPath())
无法正常工作,因为file:/D:/hz/hzTest-jar-with-dependencies.jar!/test.txt
并非真正的文件系统路径。
由于该文件是 jar 文件(实际上是 zip 存档)的一部分,因此没有指向它的有效文件系统路径。
标准方法是使用getClassLoader().getResourceAsStream("test.txt");
。您必须修改应用程序以便它可以从类路径资源或URL读取,或使用getResourceAsStream()
将资源复制到文件系统上的临时文件,然后指向它。
答案 1 :(得分:-1)
File file = new File(resource.getPath());
Bzzt。资源不是文件。你有一个URL。直接使用其输入流。
答案 2 :(得分:-1)
将URL转换为可在Java外部使用的绝对路径的正确方法是:
import java.net.URL;
import java.nio.file.Paths;
URL resource = Main.class.getClassLoader().getResource("test.txt");
String absolutePath = Paths.get(resource.toURI()).toAbsolutePath());
这仅适用于资源来自file://
网址的情况 - 如果您的应用程序是作为jar文件构建的,那么它将无法正常工作,因为其他应用程序无法直接查看jar文件。< / p>
看起来有点令人费解,而且确实如此。为了打破这一点:
URL resource = ...;
URI uri = resource.toURI();
Path path = Paths.get(uri);
String absolutePath = path.toAbsolutePath();