0

DataInputStreamとBufferedInputStreamを使用してクライアントからファイルを受信するサーバープログラムを構築しようとしています。

これが私のコードで、無限ループに陥ります。これは、available()を使用していないためだと思いますが、よくわかりません。

DataInputStream din = new DataInputStream(new BufferedInputStream(s.getInputStream()));
//s is socket that connects fine
fos = new FileOutputStream(directory+"/"+filename);

byte b[] = new byte[512]; 
int readByte = din.read(b);
while(readByte != 1){
    fos.write(b);
    readByte = din.read(b);
    //System.out.println("infinite loop...");
}

なぜそれが無限ループに陥るのか誰か教えてもらえますか?利用できないための場合、使い方を教えてください。私は実際にグーグルで検索しましたが、使い方に戸惑いました。どうもありがとうございます

4

3 に答える 3

2

やりたいと思いますwhile(readByte != -1)ドキュメントを参照してください(-1は、これ以上読むものがないことを意味します)。

コメントへの回答

これは私のために働きます:

FileInputStream in = new FileInputStream(new File("C:\\Users\\Rachel\\Desktop\\Test.txt"));
DataInputStream din = new DataInputStream(new BufferedInputStream(in));
FileOutputStream fos = new FileOutputStream("C:\\Users\\Rachel\\Desktop\\MyOtherFile.txt");

byte b[] = new byte[512]; 
while(din.read(b) != -1){
    fos.write(b);
}

System.out.println("Got out");
于 2011-10-05T03:37:38.643 に答える
0

あなたの質問はすでに回答されていますが、このコードには別の問題があり、以下で修正されています。正規のストリームコピーループは次のようになります。

while ((count = in.read(buffer)) > 0)
{
  out.write(buffer, 0, count);
}
于 2011-10-05T04:02:26.300 に答える
0

レイチェルが指摘したように、DataInputStreamのreadメソッドは、正常に読み込まれたバイト数を返します。最後に達した場合は-1を返します。終わりに達するまでループする慣用的な方法は、あなたが誤っwhile(readByte != -1)て持っていたのに対してです。1正確に1バイトが読み取られることが決してない場合、これは無限ループになります(readByteストリームの終わりに達すると、-1から変更されることはありません)。たまたま正確に1バイトが読み取られる反復があった場合、これは無限ループに入るのではなく、実際には早期に終了します。

于 2011-10-05T03:44:38.657 に答える