2009-02-27 19 views
1

via apache.commons.FtpClientでファイルを読んでいます。InputStreamを監視する最良の方法は何ですか?

InputStream inStream = ftp.retrieveFileStream(path + file.getName()); 
String fileAsString = ""; 

if(inStream == null){ 
    return; 
} 
while((c = inStream.read()) != -1){ //this is where the code sometimes just hangs    
    fileAsString += Character.valueOf((char)c); 

} 

私の質問は、システムをロックこのから保護するための最も信頼性の高い方法があるものです...これは時間の罰金99.9%に動作しますが、時にはそれだけでread()メソッドで死にます無期限に。私は別のスレッドでタイマーを設定する必要がありますか?それとも簡単な方法がありますか?それはあなたが実際に読む前にブロックせずに読むことができることを確認倍になるようにするだけのドキュメントをざっと見てから

答えて

1

、あなたがやった場合は...

while (inStream.available() > 0 && (c = inStream.read()) != -1) 

に思えます。私はこれで確信していない。

+0

私はこのソリューションが気に入っていますが、利用可能なチェックとread()のチェックの間に何らかの形でコネクションが陳腐化する可能性があると思われます...これは起こりそうもないことですが、 –

+0

接続が遅い場合、available()はファイルの先頭または終わりの前のいずれかに0を返します。 –

+0

FtpClientに深刻な問題がなければ、これは本当の解決策ではありません。 read()はavailable()が0を返す場合にのみブロックする必要があるため、read()で待機するのではなく、このループで待機し、さらに多くのCPUを使用します。 –

4

コードがハングアップすると、FTPサーバーがファイル全体を送信していないことを意味します。タイマーを使うことはできますが、FtpClientではタイムアウトを設定できると思います。

ところで、あなたがファイルを読む方法は、非常には非効率です。ファイルが数Kより大きい場合は、CPU使用量が増加します。

バイトから文字を作成しています(これは悪い考えです)。ファイル内のすべてのバイトの文字列オブジェクトです。

提供されているコピーメソッドまたはcommons-ioライブラリに付属のものを使用して、データをByteArrayInputStreamにコピーすることをお勧めします。

+0

にchar/byte +文字列の問題を指摘するために1を加えました。これは少なくともStringBuilder.appendでなければなりません。 –

+0

とInputStream.read(byte [] b、int off、int len)も同様に使用する必要があります。したがって、この投稿は実際の回答ではありませんが、それは私からのOP - +1にも最大の助けとなります。 –

+0

私はInputStream.read(byte [] b、int off、int len)は使用する必要がありますが、これは3つの回答のうちの1つによって言及されていたと私は同意します。 ?? –

関連する問題