0

私のアプリケーションでは、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;
}
4

2 に答える 2

2

is.read()は完全なコンテンツを返さない場合があります。次のようなループにread()を入れる必要があります。

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

PS:

ファイルのサイズがわかっている場合は、DataInputStreamを使用して、ループなしでバッファーを読み取ることができます。

byte[] buf = new byte[exactFileSize];
DataInputStream dis = new DataInputStream(is);
dis.readFully(buf);
于 2012-06-18T22:28:56.000 に答える
2

InputStream.read()通常、ストリーム全体を読み取るのではなく、その一部のみを読み取ります。InputStream.read()は、実際に読み取ったバイト数を返すことに注意してください。これを確認する必要があります。

InputStream典型的なパターンは、使用可能なバイトがなくなったことを が報告するまでループすることです。

于 2012-06-18T22:26:02.193 に答える