我正在尝试制作一个自动更新的客户端。jarred 客户端将转到服务器并请求更新文件。服务器将发送更新文件。当更新文件(包含已转换为字节数组的jar文件)到达时,客户端将检查它是否具有客户端jar的最新版本(更新文件中的那个)。顺便说一下,引用“in”是连接到服务器的套接字。
UpdateFile uf = (UpdateFile) in.readObject();
System.out.println("Client checking if update needed");
if (!uf.getVersion().equals(myVersion)) {
System.out.println("Client needed update");
uf.update(updateLocation);
}
如果它没有最新的jar,它将调用UpdateFile中的函数update(String whereToUpdate)。这将删除旧的 jar 文件(调用函数 update() 的那个!)并通过将 byte[] 写入相同的位置来替换它。
public void update(String location) {
try {
boolean b = (new File(location)).delete();
System.out.println("removed old jar file");
updateJar.writeBytes(location);
} catch (Exception ex) {
ex.printStackTrace();
}
}
在这段代码中,updateJar 是一个 NetworkingFile(我自己的类)。这个 NetworkingFile 将不可序列化的对象转换为 byte[],发送到接收器,然后将文件写回磁盘。
public class NetworkingFile implements Serializable{
byte[] cArray;
String name;
public NetworkingFile(File f, String fileName) {
name = fileName;
compressFile(f);
}
public NetworkingFile(byte[] b, String fileName) {
cArray = b;
name = fileName;
}
public void compressFile(File f) {
cArray = new byte[(int)f.length()];
try {
FileInputStream inputReader = new FileInputStream(f);
BufferedInputStream fileReader = new BufferedInputStream(inputReader);
fileReader.read(cArray, 0, cArray.length);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public String getFileName() {
return name;
}
public byte[] getCompressedFile() {
return cArray;
}
public void writeBytes(String location) {
try {
File writeFile = new File(location);
FileOutputStream writer = new FileOutputStream(writeFile);
writer.write(cArray);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
此代码在编译或执行 FIRST jar 时不会出错。但是,当 jar 完成更新后,我退出程序并尝试使用“java -jar filename.jar”运行它。但是,我在运行时收到此错误:错误:无效或损坏的 jarfile DropBoxClient.jar
关于可能导致这种情况的任何想法?所有帮助将不胜感激。