質問

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

   public abstract void write(int b) throws IOException;

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

役に立ちましたか?

解決

実際、私は最近少しバイトを扱ってきましたが、それらは迷惑な場合があります。わずかな挑発でintにアップコンバートし、数値をバイトに変換する指定はありません。たとえば、8lは長い値8を与えますが、バイトについては(byte)8

さらに、配列を使用している場合を除いて、(ほとんど)常にintとして内部に格納されます(そして、その場合でも..不明)。

バイトを使用する唯一の理由は、実際に8ビットが必要なI / Oであると推測しているだけですが、内部的には常にintを使用することを期待しています。

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

少なくとも、何年も前に読んだことを覚えていますが、今では変更されているかもしれません。

特定の質問に対する回答の例として、関数(f)が1バイトを使用し、2バイト(b1およびb2)があった場合、

f(b1 & b2)

b1&が機能しないため、動作しません。 b2はintにアップコンバートされ、intは自動的にダウンコンバートできません(精度の低下)。したがって、コーディングする必要があります:

f( (byte)(b1 & b2) )

イライラするでしょう。

また、なぜb1&を要求する必要もありません。 b2アップコンバート-私は最近、少しばかりそのことに興味を持っています!

他のヒント

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

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

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

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

よろしく

Java IOStreamクラスは、1.0からJavaの一部となっています。これらのクラスは8ビットデータのみを処理します。私の推測では、インターフェイスはこのように設計されているため、1つのwrite(int b)メソッドがint、short、byte、charの値に対して呼び出されます。これらはすべて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クラスはより移植性があります。

バイトはデフォルトで署名されており、ファイルはバイトを符号なしの値として保存するためでしょう。それが、 read()がintを返す理由です-$ FFに対して-1ではなく255を返します。 write(int)と同様に、$ FFを1バイトに255として保存することはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top