0

自動更新クライアントを作成しようとしています。jarされたクライアントはサーバーに移動し、更新ファイルを要求します。サーバーは更新ファイルを送信します。更新ファイル(バイト配列に変換された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();
    }
 }
}

このコードは、FIRSTjarをコンパイルまたは実行するときにエラーを発生させません。ただし、jarの更新が終了したら、プログラムを終了し、「java-jarfilename.jar」を使用して実行しようとします。ただし、実行時に次のエラーが発生します。エラー:無効または破損したjarファイルDropBoxClient.jar

これを引き起こす可能性のあるアイデアはありますか?すべての助けをいただければ幸いです。

4

1 に答える 1

0

ここにいくつかのことがあります。

1つ目は、FileOutputStreamを閉じていないことです。フラッシュを閉じないと、すべてをディスクに書き込まずにプログラムが終了する場合があります。

2つ目は、fileReader.readがその数のバイトを読み取ることは保証されていません。これは、実際にその数のバイトを読み取る前に返される可能性があるためです。そのため、実際に読み取られたバイト数を含むintが返されます。(ここでjavadocsを参照してください)

あるファイルから別のファイルにファイルをコピーするための推奨される方法は、ここで実装した方法とはかなり異なります。たとえば、このソースコードの例を参照してください。

Javaストリームがどのように機能するかについてもう少し読むことをお勧めします。Javaストリームは実際よりも単純に見えるかもしれません。

于 2012-07-24T16:03:52.083 に答える