2017-10-25 11 views
-3
javaでサーバプログラムから読みながら、私はあいまいな出力を取得しています

を読みながら検出:-1ファイルのjava

byte [] mybytearray = new byte [content_length]; 
InputStream inputStream = clientSocket0.getInputStream(); //Getting input 
from peer0 
FileOutputStream fileOutputStream = new FileOutputStream(fileDownloaded); 
//Sending the output to local directory 
BufferedOutputStream bufferedOutputStream = new 
BufferedOutputStream(fileOutputStream); 

bytesRead = inputStream.read(mybytearray,0,content_length); 
System.out.println("First read : " +bytesRead); 
current = bytesRead; 
if(bytesRead!=content_length) { 
       current = bytesRead; 
       do { 
         System.out.println(current +"-Current"); 
         System.out.println("Read it : "+(mybytearray.length-current)); 
         bytesRead = 
           inputStream.read(mybytearray, current, (mybytearray.length-current)); 
          System.out.println("***"+bytesRead); 
         if(bytesRead == -1) { 
          //current = content_length; 
          break; 
         } 
         else 
          current += bytesRead; 
        } while(current < content_length); 
       } 

       bufferedOutputStream.write(mybytearray, 0 , current); 

       bufferedOutputStream.flush(); 
       bufferedOutputStream.close(); 
       inputStream.close(); 
       inFromServer0.close(); 

それはいくつかのファイルに対して次のような出力を与えている:

コンテンツ長33996を
C:\ Users \ユーザースミット\ gitの\ IP_Task2 \タスク1 \ピア1/rfc8183.txt.pdf
まず読む:24356
24356-現在
読みますそれ:9640
*** - 1

ループでbytesReadである-1、それによって正しいファイルを作成することはできません。

+0

コードを正しくフォーマットしてください。最近のバージョンのJavaを使用している場合は、 'InputStream.close()'を手動で呼び出すのではなく、try-with-resourceを使用して調べてください。 – omajid

答えて

1

メソッドを使用するときは、そのドキュメントを参照して、返される値を確認する必要があります。

InputStream.read(byte[], int, int)の説明を見てみましょう:

公共int型の読み取り(バイト[]はB、 int型オフ、 int型のlen) はIOExceptionが

は、データのバイト数を最大len読み込みます入力ストリームからバイト配列に変換します。 lenバイト分の読み込みが試行されますが、小さい方の読み込みが可能です。実際に読み取られたバイト数は整数として返されます。

このメソッドは、入力データが使用可能になるか、ファイルの終わりが検出されるか、または例外がスローされるまでブロックします。

lenがゼロの場合、読み込まれるバイトはなく、0が返されます。それ以外の場合は、少なくとも1バイトを読み取ろうとしています。ストリームがファイルの終わりにあるために使用可能なバイトがない場合、-1が返されます。それ以外の場合は、少なくとも1バイトが読み込まれ、bに格納されます。

読み取られた最初のバイトは、要素b [オフ]に格納され、次のバイトはb [オフ+ 1]などに格納されます。読み取られるバイト数は、最大でもlenです。実際に読み込まれたバイト数をkとする。これらのバイトは要素b [off]からb [off + k-1]に格納され、要素b [off + k]からb [off + len-1]は影響を受けません。

いずれの場合でも、要素b [0]〜b [off]と要素b [off + len] ~b [b.length-1]は影響を受けません。

InputStreamクラスのread(b、off、len)メソッドは、単にread()メソッドを繰り返し呼び出すだけです。最初の呼び出しでIOExceptionが発生した場合、その例外はread(b、off、len)メソッドの呼び出しから返されます。それ以降のread()の呼び出しでIOExceptionが発生した場合、例外はキャッチされ、ファイルの終わりのように扱われます。そのポイントまで読み出されたバイトがbに格納され、例外が発生する前に読み込まれたバイト数が返されます。このメソッドのデフォルトの実装は、要求された量の入力データlenが読み込まれ、ファイルの終わりが検出されたり、例外がスローされるまでブロックします。サブクラスは、このメソッドをより効率的に実装することを推奨します。

パラメータ:

b - the buffer into which the data is read. 

off - the start offset in array b at which the data is written. 

len - the maximum number of bytes to read. 

戻り値:

the total number of bytes read into the buffer, or -1 if there is no more data because the end of the stream has been reached. 

非常に慎重にその最後の行を読みます。 -1は特別な戻り値で、InputStreamに追加入力がないため、データが読み取られなかったことを意味します。

+0

こんにちはオマジッド、お返事ありがとうございます。私はまだコードを学んでいます、close()の世話をします。 。しかし、私の質問です:ファイルのコンテンツの長さは33996バイトです。 最初に読み取られるのは、24356バイトだけです。 私は24356から33996まで読むために次の読みを指示しました。これは 9640バイトです。しかし、それは9640出力を与えず、むしろ-1を与える。 – ARP

+0

どこかにバグがある。 InputStreamで読み込んでいるソケットからデータが供給されていません。これはJavaプラットフォームのバグである可能性がありますが、ネットワークのもう一方の端で接続が中止される可能性は非常に高いです。このデータを送信するのは何ですか?すべてのデータを送信していることを確認できますか? – omajid

関連する問題