1

Oracle Javaチュートリアルの例では、文字を整数として読み取ろうとしています。

なぜ、どのように機能するのですか?

try {
        inputStream = new FileReader("xanadu.txt");
        outputStream = new FileWriter("characteroutput.txt");

      int c;
      while ((c = inputStream.read()) != -1) {
            outputStream.write(c);
        }
4

5 に答える 5

4

charを読み取る場合、ファイルの終わりに使用できる値はありません。

より大きなタイプを使用することにより、intすべての可能な文字と、ファイルの終わりを意味する別の記号を持つことが可能になります。

于 2012-05-04T17:39:02.760 に答える
0

これは、文字が整数であるためです。各文字には、同等のユニコードがあります。

于 2012-05-04T17:38:41.577 に答える
0

基本的にacharintです。次のことを試してください。

char c = 'c';
int i = c;

これにより、コンパイルエラーは発生しません。

于 2012-05-04T17:39:20.903 に答える
0

Javaの舞台裏では、acharは16ビットの符号なし値です。Anintは32ビットの符号なし値です。

charsその値のサブセットがintsASCIIテーブルで意味を持ちます。

この関係があるため、構文では2つのタイプを簡単に他方に変換できるので便利です。

于 2012-05-04T17:45:46.577 に答える
0

Reader/のドキュメントを読むとWriter、次の説明が表示されます。

ライタークラス-writeメソッド

1文字を書き込みます。書き込まれる文字は、指定された整数値の下位16ビットに含まれます。上位16ビットは無視されます。

そして、コードは単純に次のことを行います。

public void write(int c) throws IOException {
    synchronized (lock) {
        if (writeBuffer == null){
            writeBuffer = new char[writeBufferSize];
        }
        writeBuffer[0] = (char) c;
        write(writeBuffer, 0, 1);
    }
}

したがって、の場合Writer、そして私が見る限り、これはcharデータ型で行われた可能性があります。

Reader一方、intのメソッドreadには、文字またはストリームインジケーターの終わりを返す役割があります。

ドキュメントには次のように書かれています。

リーダークラスの読み取りメソッド

ストリームの終わりに達した場合は、0〜65535または-1の範囲の整数として読み取られる文字。

そのため、charだけではないデータ型が必要であり、この場合はintが使用されます。

そしてそれは次のように実装されます:

public int read() throws IOException {
    char cb[] = new char[1];
    if (read(cb, 0, 1) == -1)
        return -1;
    else
        return cb[0];
}

したがって、この2番目のケースは、より大きなデータ型の使用を正当化します。

両方のクラスでintを使用する理由は、一貫性の問題である可能性があります。

于 2012-05-04T17:58:23.953 に答える