【发布时间】:2011-07-07 12:23:09
【问题描述】:
我需要能够访问存储在已编译 jar 文件中的文件。我已经想出了如何将文件添加到项目中,但我将如何在代码中引用它?如何将文件从 jar 文件复制到用户硬盘上的某个位置?我知道有几十种方法可以访问文件(FileInputStream、FileReader 等),但我不知道如何查看其内部。
【问题讨论】:
我需要能够访问存储在已编译 jar 文件中的文件。我已经想出了如何将文件添加到项目中,但我将如何在代码中引用它?如何将文件从 jar 文件复制到用户硬盘上的某个位置?我知道有几十种方法可以访问文件(FileInputStream、FileReader 等),但我不知道如何查看其内部。
【问题讨论】:
你可以这样使用:
InputStream is = this.getClass().getClassLoader().getResourceAsStream(fileFromJarFile);
如果 foo.txt 在您的 JAR 文件的根目录中,您将使用:
InputStream is = this.getClass().getClassLoader().getResourceAsStream("foo.txt");
假设该类与资源在同一个 JAR 文件中,我相信。
【讨论】:
您可以使用getResource() 来获取类路径中文件的URL,或者使用getResourceAsStream() 来获取InputStream。
例如:
BufferedReader reader = new BufferedReader(new InputStreamReader(
this.getClass().getResourceAsStream("foo.txt")));
【讨论】:
您可以使用 JarFile 类读取 JAR 文件的内容。
这是一个示例,说明如何从 JAR 文件中获取特定文件并将其解压缩:
JarFile jar = new JarFile("foo.jar");
String file = "file.txt";
JarEntry entry = jar.getEntry(file);
InputStream input = jar.getInputStream(entry);
OutputStream output = new FileOutputStream(file);
try {
byte[] buffer = new byte[input.available()];
for (int i = 0; i != -1; i = input.read(buffer)) {
output.write(buffer, 0, i);
}
} finally {
jar.close();
input.close();
output.close();
}
【讨论】:
只是想补充一点,如果我们想访问位于以下路径的 Jar 中的文件:
Windows:
c:\your-jar-file.jar\dir1\dir2\dir3\foo.txt
Linux:
/home/your-jar-file.jar/dir1/dir2/dir3/foo.txt
需要使用以下代码(注意路径开头有NO“/”(正斜杠)字符):
InputStream is = this.getClass().getClassLoader().getResourceAsStream("dir1/dir2/dir3/foo.txt");
【讨论】:
查看 JarFile 类。获取 jar 文件中特定条目的 InputStream 所需的一切都在那里。
【讨论】: