私はアプリケーション開発に取り組んでいます。そのアプリケーションで、ファイルの保存、取得、削除の操作を実行しています。サーバー上のファイルを識別するために、インデックス(ハッシュマップファイル)ファイルを使用しています。アップロード操作を実行するたびに、「インデックス」ファイルを更新し、他のアップロードファイルと一緒にサーバーに「インデックス」ファイルをアップロードします。
削除操作を実行するために、最初に「インデックス」ファイルを取得し、インデックスに基づいてサーバーからファイルを削除し、「インデックス」ファイルを更新した後、サーバーに「インデックス」ファイルを再度アップロードします。
ファイルのアップロード操作は正常に実行できますが、削除操作の実行中に「インデックス」ファイルを取得しようとすると、「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;
}