31

私はOutputStreamを書いていますが、OutputStreamインターフェースでこれに気づきました。

   public abstract void write(int b) throws IOException;

この呼び出しはストリームに1バイトを書き込みますが、なぜ整数を引数として取るのですか?

4

5 に答える 5

26

したがって、EOF を通知できます。

「read() が int 値を返すことに注意してください。入力がバイト ストリームの場合、read() がバイト値を返さないのはなぜですか? int を戻り値の型として使用すると、read() は -1 を使用してそれを示すことができます。ストリームの終わりに達しました。」

http://java.sun.com/docs/books/tutorial/essential/io/bytestreams.html

于 2009-09-10T22:55:40.780 に答える
10

実際、私は最近バイトを少し扱っ​​ていて、迷惑になることがあります。それらはわずかな挑発で int にアップコンバートされ、数値をバイトに変換する指定はありません。

その上、配列を使用していない限り、(ほとんどの場合) 常に内部的に int として格納されます (そして、おそらくその場合でも..確かではありません)。

バイトを使用する唯一の理由は、実際には 8 ビットが必要な i/o であるとほぼ想定していると思いますが、内部的には、常に int を使用することを期待しています。

ちなみに、バイトは常にマスクする必要があるため、パフォーマンスが低下する可能性があります...

少なくとも私は何年も前にそれを読んだことを覚えていますが、今では変わっている可能性があります.

特定の質問に対する回答の例として、関数 (f) が 1 バイトを取り、2 バイト (b1 と b2) がある場合、次のようになります。

f(b1 & b2)

b1 と b2 は int にアップコンバートされ、int は自動的にダウンコンバートできない (精度が失われる) ため、うまくいきません。したがって、次のようにコーディングする必要があります。

f( (byte)(b1 & b2) )

これはイライラするでしょう。

そして、なぜ b1 と b2 がアップコンバートするのかを気にしないでください。

于 2009-09-11T00:52:42.820 に答える
7

OutputStreamのjavadocによると、この関数では上位24ビットは無視されます。このメソッドは互換性の理由で存在すると思います。したがって、最初にバイトに変換する必要はなく、整数を渡すだけで済みます。

よろしく

于 2009-09-10T21:42:42.577 に答える
3

Java IOStream クラスは、1.0 から Java の一部になっています。これらのクラスは 8 ビット データのみを扱います。私の推測では、int、short、byte、および char の値に対して 1 つの write(int b) メソッドが呼び出されるように、インターフェイスはこのように設計されています。これらはすべて int に昇格されます。実際、ほとんどの JVM は 32 ビット マシンで実行されるため、int プリミティブが最も効率的に処理できるタイプです。とにかく、コンパイラはバイトなどの型を 32 ビットを使用して自由に格納できます。興味深いことに、byte[] は実際には 8 ビット バイトのシーケンスとして格納されます。配列は非常に大きくなる可能性があるため、これは理にかなっています。ただし、int や byte などの単一のプリミティブ値の場合、動作が仕様と一致している限り、実行時に占有される最終的なスペースは重要ではありません。

より多くの背景:

http://www.java-samples.com/showtutorial.php?tutorialid=260

IOStream クラスの前提は、int を渡す場合でも、呼び出し元はデータの下位 8 ビットのみを実際に気にするということです。これは、呼び出し元が実際にバイトを処理していることを認識している限りは問題ありませんが、基になるデータが実際にはマルチバイト Unicode などの他の文字エンコーディングを使用するテキストである場合は問題になります。これが、Java 1.1 で Reader クラスが導入された理由です。テキスト データとパフォーマンスを重視する場合は、IOStream クラスの方が高速ですが、Reader クラスの方が移植性が高くなります。

于 2009-09-10T23:01:32.823 に答える