我正在尝试制作自动更新客户端。 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无效或损坏
关于可能导致此问题的任何想法?所有帮助将不胜感激。
答案 0 :(得分:0)
这里有一些事情。
第一个是您没有关闭FileOutputStream。如果你没有关闭它,程序可能会结束而不将所有内容写入磁盘。
第二个,fileReader.read不是GUARANTEED来读取那么多字节,原因很多,它可能在实际读取那么多字节之前返回。这就是为什么它返回一个实际读取的字节数的int。 (见javadocs here)
将文件从一个文件复制到另一个文件的推荐方法与您在此处实现的方式完全不同,请参阅this source code example。
我建议你多读一些关于Java流如何工作的内容,它们可能看起来比它们简单。