0

我正在尝试制作一个自动更新的客户端。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

关于可能导致这种情况的任何想法?所有帮助将不胜感激。

4

1 回答 1

0

这里有几件事。

第一个是您没有关闭 FileOutputStream。如果你不关闭刷新它,程序可能会在没有将所有内容写入磁盘的情况下结束。

第二个,fileReader.read 不能保证读取那么多字节,由于多种原因,它可能会在实际读取那么多字节之前返回。这就是为什么它返回一个带有实际读取的字节数的 int 的原因。(请参阅此处的 javadocs

将文件从一个文件复制到另一个文件的推荐方法与您在此处实现的方法完全不同,例如,请参见此源代码示例

我建议您阅读更多有关 Java 流如何工作的信息,它们可能看起来比实际简单。

于 2012-07-24T16:03:52.083 回答