从FTP下载Java时不完整的文件

时间:2012-06-18 22:23:54

标签: java ftp download

在我的应用程序中,我将一个byte [](序列化对象)上传到我的FTP服务器,该服务器工作正常。然而,当我尝试下载它时,只有数组的第一部分(如3000字节)是正确的,其余部分用零填充。

我似乎无法弄清楚出了什么问题,任何帮助都会受到赞赏。 我正在使用这个包     org.apache.commons.net。*

public static byte[] downloadBoard( String host, int port, String usr, String pwd) throws IOException {
  FTPClient ftpClient = new FTPClient();
  byte[] buf = new byte[20000];

  try {
    ftpClient.connect( host, port );
    ftpClient.login( usr, pwd );

    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
    InputStream is = ftpClient.retrieveFileStream("asdf.board");
    is.read(buf);
    is.close();

    ftpClient.completePendingCommand();
    ftpClient.logout();
  } finally {
    ftpClient.disconnect();
  }
  return buf;
}

2 个答案:

答案 0 :(得分:2)

InputStream.read()通常不会为您阅读整个流,只有部分内容。请注意,InputStream.read()会返回实际读取的字节数,您需要检查这些字节。

典型模式是循环,直到InputStream报告没有更多字节可用。

答案 1 :(得分:1)

is.read()可能不会返回完整内容。您需要将read()放入类似于此的循环中:

int pos = 0;
while (true) {
  int count = is.read(buf, pos, buf.length - pos);
  if (count <= 0) {
    break;
  }
  pos += count;
}

P.S。:

如果你知道文件的大小,你可以使用DataInputStream来读取没有循环的缓冲区:

byte[] buf = new byte[exactFileSize];
DataInputStream dis = new DataInputStream(is);
dis.readFully(buf);