web-dev-qa-db-ja.com

InputStream#read()がバイトではなくintを返すのはなぜですか?

InputStream#read()intではなくbyteを返すのはなぜですか?

49
user489041

byteは127まで-128しか保持できませんが、255までは0を返す必要があります(バイトが残っていない場合は-1(つまり、EOF))。 byteを返したとしても、EOFを表す余地はありません。

さらに興味深い質問は、なぜそれがshortを返さないのかということです。

54
BalusC

ストリームを読み取ることができなくなると-1を返すため、intを返します。

バイトが返された場合、-1は有効なバイトであるため、入力がないことを示すために-1を返すことはできません。さらに、Javaは符号付きバイトのみを処理するため、127より上または-128より下の値を返すことはできませんでした。

多くの場合、ファイルを読み取るときは、処理コードに符号なしバイトが必要です。 128〜255の値を取得するには、shortを使用できますが、intを使用すると、メモリレジスタをデータバスとより効率的に整列させることができます。その結果、intを使用しても実際には情報が失われることはなく、おそらく多少のパフォーマンスが得られます。唯一の欠点はメモリのコストですが、そのintに長く留まらない可能性があります(処理してcharまたはbyte []に​​変換するため)。

17
Edwin Buck

したがって、「-1」を返すことができます。読み取るバイトがなくなったときにそれを行う必要があります。

時々バイトを返すようにすることはできず、EOF/nobyte/whateverの場合は-1なので、intを返します;)

4
Nanne

EOF(ファイルの終わりまたは通常はデータの終わり)はcharを使用して表すことができないためです。

2
wesoly

Java docが InputStream#read で言うように、値バイトは0から255の範囲のintとして返されます。つまり、つまり、バイト値[-128〜127]がint値[0〜255]に変更されたため、戻り値を使用してストリームの終わりを表すことができます。

1
andy

追加 BalusC回答

  • 許可するbyteではありません[0; 255]を主容量として、さらに-1をEOF結果として
  • intは、結果をマシンWord(I/O操作の主な要件の1つ-velocity)に調整するために使用されるため、機能するはずです。できるだけ早く!)

非常に遅いため、例外は使用されません。

0
radistao