【问题标题】:A Problem while Retriving file from FTPS Server从 FTPS 服务器检索文件时出现问题
【发布时间】:2010-09-03 08:54:31
【问题描述】:

我正在从事应用程序开发。在该应用程序上,我正在执行文件存储、检索和删除操作。为了识别服务器上的文件,我正在使用索引(哈希映射文件)文件。每次我执行上传操作时,我都会更新“索引”文件并在服务器上上传“索引”文件以及其他上传文件。

为了执行删除操作,我首先检索“索引”文件并根据索引从服务器中删除文件,并在更新“索引”文件后再次在服务器上上传“索引”文件。

我能够成功执行文件上传操作,但在执行删除操作时,当我尝试检索“索引”文件时,我收到“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 服务器,则返回 '0' 并且“FileData”包含有关文件(属性)的信息。

我在执行上传操作时使用的代码相同。它在那里工作正常,无一例外。但是当我检索“索引”文件时执行删除操作时,我在语句中遇到异常:

Map filesUploaded = (HashMap) objIn.readObject();

例外是:

严重:无

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) { 如果(!连接){ 返回错误; }

    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;
}

【问题讨论】:

    标签: java file-io ftps


    【解决方案1】:

    您确定 INDEX 文件已正确下载吗?

    当应用程序关闭时它存在于文件系统中?

    您使用的是什么 FTP 库?我只知道来自 Apache 的 commons.net,我不认识“retrFile”文件方法。是否可以线程化,使得readObject语句执行时文件没有完全下载?

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      相关资源
      最近更新 更多