我在Java中创建了一些代码,它将更改另一个.jar文件中的某些文件,我知道解包/更改有效,但重新打包却没有。它确实成功了,但是当我比较新的和原始的(我删除了更改文件的代码)时,它们不同。有趣的是,当我将它们都提取到不同的目录中时,我对它们都运行了diff -rqy
,它没有显示出任何差异。
这是当前的功能:
public static void add(File source, JarOutputStream target, String removeme)
throws IOException
{
BufferedInputStream in = null;
try
{
File source2 = new File(source.getPath().replaceAll("^" + removeme,
""));
// File source2 = source;
if (source.isDirectory())
{
String name = source2.getPath().replace("\\", "/");
if (!name.isEmpty())
{
if (!name.endsWith("/"))
name += "/";
JarEntry entry = new JarEntry(name);
entry.setTime(source.lastModified());
target.putNextEntry(entry);
target.closeEntry();
}
for (File nestedFile : source.listFiles())
add(nestedFile, target, removeme);
return;
}
JarEntry entry = new JarEntry(source2.getPath().replace("\\", "/"));
entry.setTime(source.lastModified());
target.putNextEntry(entry);
in = new BufferedInputStream(new FileInputStream(source));
byte[] buffer = new byte[2048];
while (true)
{
int count = in.read(buffer);
if (count == -1)
break;
target.write(buffer, 0, count);
}
target.closeEntry();
}
finally
{
if (in != null)
in.close();
}
}
我称之为:
JarOutputStream zip = new JarOutputStream(
new FileOutputStream(JARFILE));
for (File nestedFile : new File(DIRECTORY).listFiles())
{
Utils.add(nestedFile, zip,
new File(DIRECTORY).getAbsolutePath());
}
zip.close();
任何人都可以指导我在功能上改变什么,或者我应该使用哪些其他功能?该目录有子目录,所以我需要一个能扫描它们的函数。
提前致谢!
编辑:我不想使用jar
命令,因为我不希望用户需要安装JDK。我想要使用纯Java的东西(库可以,只要我可以将它们包含在程序中)。
编辑2:我正在制作一个Minecraft模组(如MCPatcher和ModLoader),但当我运行java -jar minecraft.jar
时,它会给我这个:Invalid or corrupt jarfile
。正确的.jar不会给出这个(只是一个主类错误,应该发生)。
答案 0 :(得分:1)
我想你可能对java.util.jar感兴趣。此链接可能对您有用..
http://www.theserverside.com/discussions/thread.tss?thread_id=32600