1

解決しました

available()メソッドが実際に何をするのか誤解していたので、データを書き込むコードを次のように変更しました。

int b = input.read();
while (b != -1) {
    output.write(b);
    b = input.read();
}

別の機会に、より効率的な読み取り/書き込み方法に取り組みます。今のところ、それが機能していることをうれしく思います。助けてくれてありがとう!

元の投稿

Commons-Netライブラリを使用してFTP経由でサーバーと対話していますが、サーバーからローカルマシンにファイルをダウンロードしようとすると問題が発生します。これがComments-Net.FTPClientのバグかどうかはわかりませんが、ライブラリを正しく使用していない可能性が非常に高くなります。とはいえ、問題をグーグルで検索したところ、解決策を見つけることができませんでした。見たサンプルコードは、ファイルのダウンロードに私と同じ方法を使用しているようです。

とにかく、実際の問題は、ダウンロードされたファイルの一部が、データが含まれているはずなのに完全に空であるということです。これはランダムに発生するため、すべてのファイルをダウンロードするたびに、毎回異なるファイルが空になります。サーバーからデータを読み取ったり、ファイルに書き込んだりする方法に問題があると思います。

コードは次のとおりです。

// For each file
InputStream input = ftp.retrieveFileStream(sourcePath);
ftp.completePendingCommand();

OutputStream output = new FileOutputStream(new File(destinationPath));
while (input.available() > 0) {
    output.write(input.read());
}

input.close();
output.close();

私はネットワーキングにかなり慣れていないので、私はただ愚かで、本当に単純な間違ったことをしているだけですか?

4

2 に答える 2

2

input.available()を使用しないでください。これは、ブロックせずに使用可能な入力の量を示すだけです。代わりに、ファイルの終わりまでループします(つまり、read()が-1を返すまで)。

http://download.oracle.com/javase/6/docs/api/java/io/InputStream.html#read()

効率が懸念される場合は、一度に複数のバイトを読み取ってみることもできます。

于 2011-07-14T12:38:27.060 に答える
0

commons-ioをチェックしてくださいIOUtilsFileUtilsストリーム処理が簡単になります。

于 2011-07-14T12:37:48.543 に答える