我使用以下代码尝试将包含其所有子目录和文件的目录打包到一个jar文件中。
private void writeFile(JarOutputStream jos, File f) throws IOException {
byte buffer[] = new byte[BUFFER_SIZE];
if (f == null || !f.exists())
return; //
JarEntry jarAdd = new JarEntry(f.getName());
jarAdd.setTime(f.lastModified());
jos.putNextEntry(jarAdd);
if(f.isDirectory()){
File[] files = f.listFiles();
for(int i = 0; i < files.length ; i++){
writeFile(jos,files[i]);
}
}
else{
FileInputStream in = new FileInputStream(f);
while (true) {
int nRead = in.read(buffer, 0, buffer.length);
if (nRead <= 0)
break;
jos.write(buffer, 0, nRead);
}
in.close();
}
}
但是FileInputStream对目录不起作用,所以我假设添加JarEntry就足够了。
由于我确实有另一个问题,我无法看到这个假设是否正确。 这个问题是许多条目都是重复的。
尝试添加结构时...
activation
/--activation
/-- somefile.txt
...此代码失败,因为激活被添加两次到jar。 由于那些是彼此嵌套的不同目录,我不明白为什么这不应该以某种方式起作用。
似乎使用file.getName()添加条目将获得不具有的入口ID 区分这些文件所在的目录。 但是当我使用
时file.getAbsolutePath()
例如,jar结构搞砸了
像“C_”这样的目录和包含的文件不再可读。
有人可以推荐一种方法来正确打包jar文件中的目录结构吗?
答案 0 :(得分:4)
请注意,表示目录(文件夹)的JarEntry
必须以斜杠(“/
”)结尾才能被视为这样;否则它将被视为普通文件。
JarEntry dir = new JarEntry("activation/");
答案 1 :(得分:3)
条目的名称应该是树根的相对路径。如果你有
a
-- b
------c.txt
条目应为a/
,a/b/
和a/b/c.txt
。为您的递归方法(最初为空字符串)添加前缀参数,并且每次满足目录时,使用当前前缀+附加的目录名称+ /
调用该方法。并且始终在文件名前加上前缀以组成条目名称。