2017-11-08 20 views
1

私はかなり長い間JavaのI/Oで作業していますが、なぜintを使用するのか疑問に思っていません。これは私が意味するものです:Java OutputStreamでのintの出力

/** 
* Writes a byte. This method will block until the byte is actually 
* written. 
* 
* @param val the byte to be written to the stream 
* @throws IOException If an I/O error has occurred. 
*/ 
public void write(int val) throws IOException { 
    bout.write(val); 
} 

ドキュメントには、「バイトを書き込む」メソッドがかなり明確です。 DataOutput::write(int)をご覧ください。これは署名です:

/** 
* Writes to the output stream the eight 
* low-order bits of the argument <code>b</code>. 
* The 24 high-order bits of <code>b</code> 
* are ignored. 
* 
* @param  b the byte to be written. 
* @throws  IOException if an I/O error occurs. 
*/ 
void write(int b) throws IOException; 

24 bの上位ビットは無視されます。少なくとも私は奇妙に聞こえる。なぜそれを宣言しなかったのですか

void write(byte b) throws IOException; 

歴史的な理由はありますか?または何かもっと微妙なもの?

+0

int型の値を渡すと、キャストする必要はありません。 (もちろん整数が書かれることはないことに注意してください) –

+0

@StefanLoKranDotti整数が書かれていないという事実は、intをバイトに明示的にキャストするよりもはるかに混乱しているようです。 –

+0

はい - そうです。たとえば、BufferedOutputStreamを使用すると、内部的にキャストを行うだけです。 –

答えて

1

は、符号付きと符号なしbyte

Javaは符号なしのプリミティブデータ型をサポートしていないので、それは符号なしバイトを表現するためにintで動作するように、一般的に簡単です。

byte b1 = (byte) 255; 
//prints -1, but in fact I would like to interpret the byte as a number 
// from 0-255 
System.out.println(b1); 

int i = b1 & 0xFF; 
System.out.println(i); // ok, now we have 255 

この戦略でもうまくいきます。負の値を持つ場合は、int、狭いプリミティブ変換を実行すると下位バイト(JLS 5.1.3で指定されたもの)が使用され、2の補数の負数で正しいバイトが返されます(オーバーフローがない場合)。だから、うまくint作品を使用して

intを使用して

:あなたは、符号付きと符号なしバイトを表現するためにそれを使用することができます。

int i1 = 255; 
int i2 = -1; 

byte b1 = (byte) i1; 
byte b2 = (byte) i2; 
//true, they are both 0xFF, but with int can be intepreted in different ways. 
System.out.println(b1 == b2);