0

FileOutputStream の write() メソッドは int を取りますが、最初の 3 バイトを切り捨て、そのバイトをストリームに書き込みます。ファイルに ASCII 値が 127 を超える文字が含まれており、そこからバイトが読み取られて出力ストリーム (別のテキスト ファイル) に書き込まれる場合、Java ではバイトの最大値が +127 になる可能性があるため、どのように表示されますか。

テキスト ファイル (input.text) に ASCII 値が 155 の文字 '›' が含まれている場合、入力ストリーム、input はそれから読み取ります。 int in= new FileInputStream("input.txt").read();//in = 155

これで、別のテキスト ファイル (output.txt) に書き込みます。

new FileOutputStream("output.txt").write(in);

ここで、整数 "in" は、対応する 10 進数値 -101 を持つバイトに切り捨てられます。キャラクターに関する情報が失われたように見えるにもかかわらず、どのようにしてキャラクターをファイルに書き込むことができたのでしょうか?

ちょうど今、私は Java ドキュメントで write(int) メソッドの説明を調べましたが、私が観察したのは

書き込みの一般契約では、1 バイトが出力ストリームに書き込まれます。書き込むバイトは、引数 b の下位 8 ビットです。b の上位 24 ビットは無視されます。

したがって、以前に考えたこととは反対に(127より大きい値の整数をバイトにダウンキャストするときに発生するように、write()のintが切り捨てられます)、上位24ビットのみが無視され、最下位8ビットのみが考慮されると思います. 切り捨てやバイトへの変換は行われません。私は正しいと思います。

4

1 に答える 1

3

Java はバイトを符号付きとして扱うのに対し、文字セットの仕様では通常、バイトは符号なしであると見なされているため、混乱が生じていると思います。

実際155、符号なしバイトは符号付きバイトです-101。( 256 - 101 == 155)。ビットパターンは同じです。それらを署名付きと見なすか、署名なしと見なすだけの問題です。

切り捨てがどのようにコーディングされるかは、実装固有です。しかし、情報が失われることはありません...そもそも8ビットコードを持っていたと仮定します。

于 2013-10-16T12:14:20.020 に答える