InputStream#read()
がint
ではなくbyte
を返すのはなぜですか?
byte
は127まで-128しか保持できませんが、255までは0を返す必要があります(バイトが残っていない場合は-1(つまり、EOF))。 byte
を返したとしても、EOFを表す余地はありません。
さらに興味深い質問は、なぜそれがshort
を返さないのかということです。
ストリームを読み取ることができなくなると-1を返すため、intを返します。
バイトが返された場合、-1は有効なバイトであるため、入力がないことを示すために-1を返すことはできません。さらに、Javaは符号付きバイトのみを処理するため、127より上または-128より下の値を返すことはできませんでした。
多くの場合、ファイルを読み取るときは、処理コードに符号なしバイトが必要です。 128〜255の値を取得するには、shortを使用できますが、intを使用すると、メモリレジスタをデータバスとより効率的に整列させることができます。その結果、intを使用しても実際には情報が失われることはなく、おそらく多少のパフォーマンスが得られます。唯一の欠点はメモリのコストですが、そのintに長く留まらない可能性があります(処理してcharまたはbyte []に変換するため)。
したがって、「-1」を返すことができます。読み取るバイトがなくなったときにそれを行う必要があります。
時々バイトを返すようにすることはできず、EOF/nobyte/whateverの場合は-1なので、intを返します;)
EOF(ファイルの終わりまたは通常はデータの終わり)はcharを使用して表すことができないためです。
Java docが InputStream#read で言うように、値バイトは0から255の範囲のintとして返されます。つまり、つまり、バイト値[-128〜127]がint値[0〜255]に変更されたため、戻り値を使用してストリームの終わりを表すことができます。
追加 BalusC回答 :
byte
ではありません[0; 255]を主容量として、さらに-1をEOF結果としてint
は、結果をマシンWord(I/O操作の主な要件の1つ-velocity)に調整するために使用されるため、機能するはずです。できるだけ早く!)非常に遅いため、例外は使用されません。