Java从jar资源中读取文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java从jar资源中读取文件相关的知识,希望对你有一定的参考价值。
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:hzfile:D:hzhzTe st-jar-with-dependencies.jar! est.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
答案
new File(resource.getPath())
无法正常工作,因为file:/D:/hz/hzTest-jar-with-dependencies.jar!/test.txt
并不是真正的文件系统路径。
由于该文件是jar文件(实际上是zip存档)的一部分,因此没有指向它的有效文件系统路径。
标准方法是使用getClassLoader().getResourceAsStream("test.txt");
。您必须修改应用程序以便它可以从类路径资源或URL读取,或使用getResourceAsStream()
将资源复制到文件系统上的临时文件,然后指向它。
另一答案
File file = new File(resource.getPath());
Bzzt。资源不是文件。你有一个URL。直接使用其输入流。
另一答案
将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://
url的情况 - 如果你的应用程序是作为jar文件构建的,它将无法工作,因为其他应用程序无法直接查看jar文件。
它看起来有点复杂,而且确实如此。为了打破这一点:
URL resource = ...;
URI uri = resource.toURI();
Path path = Paths.get(uri);
String absolutePath = path.toAbsolutePath();
以上是关于Java从jar资源中读取文件的主要内容,如果未能解决你的问题,请参考以下文章