0

私はアプリケーション開発に取り組んでいます。そのアプリケーションで、ファイルの保存、取得、削除の操作を実行しています。サーバー上のファイルを識別するために、インデックス(ハッシュマップファイル)ファイルを使用しています。アップロード操作を実行するたびに、「インデックス」ファイルを更新し、他のアップロードファイルと一緒にサーバーに「インデックス」ファイルをアップロードします。

削除操作を実行するために、最初に「インデックス」ファイルを取得し、インデックスに基づいてサーバーからファイルを削除し、「インデックス」ファイルを更新した後、サーバーに「インデックス」ファイルを再度アップロードします。

ファイルのアップロード操作は正常に実行できますが、削除操作の実行中に「インデックス」ファイルを取得しようとすると、「java.io.EOFException」例外が発生します。

FTPSサーバーから「インデックス」ファイルをダウンロードするために次のコードを書いています

//download index file
if (service.retrFile("INDEX", "") == service.OK) {
    try {
        ObjectInputStream objIn = new ObjectInputStream(new FileInputStream("INDEX"));
        try {
       Map<String, FileData> filesUploaded = (HashMap<String, FileData>) objIn.readObject();

        } catch (ClassNotFoundException ex) {
           ex.printStackTrace();
        }
        objIn.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

ここで、「service.ok」はFTPSサーバーに正常に接続され、「FileData」にファイル(属性)に関する情報が含まれている場合に「0」を返します。

アップロード操作の実行中に使用しているのと同じコード。そこでは例外なく正常に動作しています。しかし、「インデックス」ファイルを取得しているときに削除操作を実行しているときに、ステートメントで例外が発生します:

マップfilesUploaded=(HashMap)objIn.readObject();

例外は:

重大:null

java.io.EOFException
        at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2298)
        at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2767)
        at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:798)
        at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298)
        at com.pixelvault.gui.DeleteServerFilesDialog.startDeleting(DeleteServerFilesDialog.java:447)

対応する操作を行った後、FTPSサーバーの接続が正しく閉じられているかどうかを確認しました。

間違っているところがわかりません。

貴重なご提案をお願いします。この問題を克服するのに役立つすべての提案に感謝します。


私はorg.apache.commons.net.ftpを使用しており、「retrFile」はサーバーからファイルを取得するために私が作成したメソッドです。

これが「retrFile」のコードです

FTPSClient ftp;

public int retrFile(String filename、String savePath){if(!connected){return ERR; }

    FileOutputStream fout = null;
    InputStream bin = null;
    try {
        ftp.enterLocalPassiveMode();
        fout = new FileOutputStream(savePath + filename);
        bin = ftp.retrieveFileStream(filename);
        if (bin == null) {
            fout.close();
            return ERR;
        }
        byte[] b = new byte[ftp.getBufferSize()];
        int bytesRead = 0;
        while ((bytesRead = bin.read(b, 0, b.length)) != -1) {
            fout.write(b, 0, bytesRead);
        }
        ftp.completePendingCommand();
        fout.close();           
    } catch (FTPConnectionClosedException ex) {
         ex.printStackTrace();
        connected = false;
        return NOT_CONNECTED;
    } catch (IOException ex) {
         ex.printStackTrace();
        return ERR;
    } finally {
        try {
            fout.close();
        } catch (IOException ex) {
             ex.printStackTrace();
            return ERR;
        }
        try {
            if (bin != null) {
                bin.close();
            }
        } catch (IOException ex) {
             ex.printStackTrace();

            return ERR;
        }
    }
    return OK;
}
4

1 に答える 1

1

INDEX ファイルが正しくダウンロードされていますか?

アプリケーションが閉じられたときにファイルシステムに存在しますか?

どの FTP ライブラリを使用していますか? 私は Apache の commons.net しか知らず、"retrFile" ファイル メソッドを認識していません。readObject ステートメントが実行されたときにファイルが完全にダウンロードされないようにスレッド化できますか?

于 2010-09-03T10:07:43.357 に答える