我正在进行应用程序开发。在该应用程序上,我正在执行文件存储,检索和删除操作。为了识别服务器上的文件,我正在使用索引(哈希映射文件)文件。每当我执行上传操作时,我都会更新“索引”文件,并在服务器上上传“索引”文件以及其他上传文件。
首先执行删除操作我正在检索“索引”文件,并根据索引从服务器删除文件,更新“索引”文件后,我再次在服务器上上传“索引”文件。
我能够成功执行文件上传操作,但在执行删除操作时,我正在尝试检索“索引”文件时出现“java.io.EOFException”异常。
我正在编写以下代码从FTPS服务器下载“index”文件
//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服务器,则返回“0” “FileData”包含有关文件(属性)的信息。
我在执行上传操作时使用的代码相同。在那里工作正常,没有例外。但是当我在检索“索引”文件时执行删除操作时,我在语句上获得了异常:
Map filesUploaded =(HashMap)objIn.readObject();
例外是:
SEVERE: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){ 返回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;
}
答案 0 :(得分:1)
您确定INDEX文件已正确下载吗?
应用程序关闭时它存在于文件系统中吗?
你使用什么FTP库?我只知道Apache的commons.net,我不认识“retrFile”文件方法。是否可以进行线程化,以便在执行readObject语句时不会完全下载文件?