Java-以编程方式将文件附加到Jar文件
我到处寻找一种方法来解决这个问题,找到了各种不同的方法来解决这个问题,但没有一种方法对我有效 我只需要一种将文件附加到Jar文件的方法,如果它们已经存在,则覆盖它们,我也希望使用最快的方法来实现这一点。我曾尝试将其转换为Zip文件并使用Zip文件系统添加文件,但我遇到了诸如“Zip END header not found”之类的错误,其他方法也可以工作,但速度非常慢(6MB的文件需要3分钟) 将文件附加到Jar文件的最快方法是什么Java-以编程方式将文件附加到Jar文件,java,file,jar,Java,File,Jar,我到处寻找一种方法来解决这个问题,找到了各种不同的方法来解决这个问题,但没有一种方法对我有效 我只需要一种将文件附加到Jar文件的方法,如果它们已经存在,则覆盖它们,我也希望使用最快的方法来实现这一点。我曾尝试将其转换为Zip文件并使用Zip文件系统添加文件,但我遇到了诸如“Zip END header not found”之类的错误,其他方法也可以工作,但速度非常慢(6MB的文件需要3分钟) 将文件附加到Jar文件的最快方法是什么 编辑:是的,继续,向下投票,而不是回答,非常有效率。你可以用更
编辑:是的,继续,向下投票,而不是回答,非常有效率。你可以用更新文本文件的同样方法来进行此操作:
- 从当前文件打开输入流
- 打开新(临时)文件的输出流
- 从输入流读取:
- 如果不需要更改,则写入输出流
- 如果内容应该删除,不要写它
- 如果内容需要更改,请先更改,然后再编写
- 如果此时需要添加新内容,请立即编写
- 重复此操作,直到处理完所有内容
- 关闭两条溪流
- 删除/重命名旧文件并将新文件重命名为旧文件
就你而言,这意味着:
- 从要添加的文件列表开始
- 打开当前Jar文件
- 打开新的(临时)Jar文件
- 复制所有现有条目(文件),将被替换的文件除外
- 插入所有新文件
- 关闭两条溪流
- 删除/重命名旧Jar文件,并将新文件重命名为旧Jar文件
- 打开新的(临时)Jar文件
- 插入所有新文件,并记住它们的名称
- 打开当前Jar文件
- 复制所有现有条目(文件),但已添加的文件除外
- 关闭两条溪流
- 删除/重命名旧Jar文件,并将新文件重命名为旧Jar文件
- 从当前文件打开输入流
- 打开新(临时)文件的输出流
- 从输入流读取:
- 如果不需要更改,则写入输出流
- 如果内容应该删除,不要写它
- 如果内容需要更改,请先更改,然后再编写
- 如果此时需要添加新内容,请立即编写
- 重复此操作,直到处理完所有内容
- 关闭两条溪流
- 删除/重命名旧文件并将新文件重命名为旧文件
就你而言,这意味着:
- 从要添加的文件列表开始
- 打开当前Jar文件
- 打开新的(临时)Jar文件
- 复制所有现有条目(文件),将被替换的文件除外
- 插入所有新文件
- 关闭两条溪流
- 删除/重命名旧Jar文件,并将新文件重命名为旧Jar文件
- 打开新的(临时)Jar文件
- 插入所有新文件,并记住它们的名称
- 打开当前Jar文件
- 复制所有现有条目(文件),但已添加的文件除外
- 关闭两条溪流
- 删除/重命名旧Jar文件,并将新文件重命名为旧Jar文件
- 以下是我能找到的最好方法:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
public class JarUtil {
public static void updateJarFile(File srcJarFile, boolean update, File ...filesToAdd) throws IOException {
File tmpJarFile = File.createTempFile("tempJar", ".tmp");
JarFile jarFile = new JarFile(srcJarFile);
boolean jarUpdated = false;
List<String> fileNames = new ArrayList<String>();
try {
JarOutputStream tempJarOutputStream = new JarOutputStream(new FileOutputStream(tmpJarFile));
try {
// Added the new files to the jar.
for (int i = 0; i < filesToAdd.length; i++) {
File file = filesToAdd[i];
FileInputStream fis = new FileInputStream(file);
try {
byte[] buffer = new byte[1024];
int bytesRead = 0;
JarEntry entry = new JarEntry(file.getName());
fileNames.add(entry.getName());
tempJarOutputStream.putNextEntry(entry);
while ((bytesRead = fis.read(buffer)) != -1) {
tempJarOutputStream.write(buffer, 0, bytesRead);
}
// System.out.println(entry.getName() + " added.");
} finally {
fis.close();
}
}
// Copy original jar file to the temporary one.
Enumeration<?> jarEntries = jarFile.entries();
while (jarEntries.hasMoreElements()) {
JarEntry entry = (JarEntry) jarEntries.nextElement();
/*
* Ignore classes from the original jar which are being
* replaced
*/
String[] fileNameArray = (String[]) fileNames
.toArray(new String[0]);
Arrays.sort(fileNameArray);// required for binary search
if (Arrays.binarySearch(fileNameArray, entry.getName()) < 0) {
InputStream entryInputStream = jarFile
.getInputStream(entry);
tempJarOutputStream.putNextEntry(entry);
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = entryInputStream.read(buffer)) != -1) {
tempJarOutputStream.write(buffer, 0, bytesRead);
}
} else if (!update) {
throw new IOException(
"Jar Update Aborted: Entry "
+ entry.getName()
+ " could not be added to the jar"
+ " file because it already exists and the update parameter was false");
}
}
jarUpdated = true;
} catch (Exception ex) {
System.err.println("Unable to update jar file");
tempJarOutputStream.putNextEntry(new JarEntry("stub"));
} finally {
tempJarOutputStream.close();
}
} finally {
jarFile.close();
// System.out.println(srcJarFile.getAbsolutePath() + " closed.");
if (!jarUpdated) {
tmpJarFile.delete();
}
}
if (jarUpdated) {
srcJarFile.delete();
tmpJarFile.renameTo(srcJarFile);
// System.out.println(srcJarFile.getAbsolutePath() + " updated.");
}
}
}
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.Enumeration;
导入java.util.List;
导入java.util.jar.JarEntry;
导入java.util.jar.jar文件;
导入java.util.jar.JarOutputStream;
公共类JarUtil{
公共静态void updateJarFile(文件srcJarFile、布尔更新、文件…filesToAdd)引发IOException{
File tmpJarFile=File.createTempFile(“tempJar”,“.tmp”);
JarFile JarFile=新的JarFile(srcJarFile);
布尔值=false;
列表文件名=新的ArrayList();
试一试{
JarOutputStream tempJarOutputStream=newjaroutputstream(newfileoutputstream(tmpJarFile));
试一试{
//将新文件添加到jar中。
for(int i=0;i