4

I apologize if this question is a bit simplistic, but I'm somewhat puzzled as to why my professor has made the following the statement:

Notice that read() returns an integer value. Using an int as a return type allows read() to use -1 to indicate that it has reached the end of the stream. You will recall from your introduction to Java that an int is equal to a char which makes the use of the -1 convenient.

The professor was referencing the following sample code:

public class CopyBytes {
   public static void main(String[] args) throws IOException {

    FileInputStream in = null;
    FileOutputStream out = null;

    try {
        in = new FileInputStream("Independence.txt");
        out = new FileOutputStream("Independence.txt");
        int c;

        while ((c = in.read()) != -1) {
            out.write(c);
        }
    } finally {
        if (in != null) {
            in.close();
        }
        if (out != null) {
            out.close();
        }
    }
 }
}

This is an advanced Java course, so obviously I've taken a few introductory courses prior to this one. Maybe I'm just having a "blonde moment" of sorts, but I'm not understanding in what context an integer could be equal to a character when making comparisons. The instance method read() returns an integer value when it comes to EOF. That I understand perfectly.

Can anyone shed light on the statement in bold?

4

6 に答える 6

5

Java では、chars は int のより具体的な型です。私は書くことができます。

char c = 65;

このコードは「A」を出力します。整数表現ではなく文字表現が必要であることをJavaが認識できるように、そこにキャストが必要です。

public static void main(String... str) {
    System.out.println((char) 65);
}

ASCII テーブルで int から文字へのマッピングを調べることができます。

また、先生によると、 int はより多くの値を許可します。-1 は文字値ではないため、フラグ値として機能します。

于 2013-10-09T01:03:02.550 に答える
1

これは、教授が C でのプログラミングに多くの時間を費やしてきたことを意味します。readfor InputStream(and FileInputStream) の定義は次のとおりです。

入力ストリームからデータの次のバイトを読み取ります。値 byte は、0 から 255 の範囲の int として返されます。ストリームの終わりに達したためにバイトが使用できない場合、値 -1 が返されます。

( http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read()を参照)

char一方、Javaの Aは Unicode 文字を表し、0 から 65535 の範囲の整数として扱われます (C では、acharは 0 から 255 または -128 から 127 のいずれかの 8 ビットの整数値です。 )

byteJava では、aは実際には -128 から 127 の範囲の整数であることに注意してください。しかし、 の定義はread問題を回避するために指定されており、とにかく 0 から 255 を返すように定められています。ここでは、javadoc は大まかな意味で「バイト」を使用しています。

于 2013-10-09T01:09:07.840 に答える
1

Java の char データ型は、単一の 16 ビット Unicode 文字です。最小値は '\u0000' (または 0) で、最大値は '\uffff' (または 65,535 を含む) です。

Java の int データ型は、32 ビットの符号付き 2 の補数の整数です。最小値は -2,147,483,648 で、最大値は 2,147,483,647 (包括的) です。

charは負 (0 ~ 65,535 の数値) にできず、int負になる可能性があるため、メソッドから返される可能性のある値は -1 (何も残っていないことを示す) から 65,535 (char の最大値) です。

于 2013-10-09T01:09:45.820 に答える
1

コンピュータにとって、文字は単なる数字です (ある時点で、ユーザーに表示するために文字の画像にマップされる場合があります)。言語には通常、「単なる数字」と「文字を参照する数字」を区別するための特別な文字型がありますが、内部ではまだある種の整数です。

read()を返す理由は、 intEOF を表す「1 つの余分な値」を持つためです。のすべての値は、char別の意味を持つように既に定義されているため、より大きな型を使用してより多くの値を取得します。

于 2013-10-09T01:01:12.490 に答える
0

あなたの教授が言及しているのは、文字は特別なコンテキストで使用される単なる整数であるという事実です。Unicode やその他のエンコーディング タイプを無視して、昔の ASCII に注目すると、ASCII テーブル ( http://www.asciitable.com/ ) がありました。文字列は、実際には一連の整数にすぎません。たとえば、TUV は 84 の後に 85 が続き、その後に 86 が続きます。

「char」タイプは、JVM の内部では整数であり、多かれ少なかれ、この整数は文字コンテキストでのみ使用する必要があるというヒントです。

それらの間でキャストすることもできます。

char a = (char) 65;
int i = (int) 'A';

これら 2 つの変数はメモリ内に同じデータを保持しますが、コンパイラと JVM はそれらをわずかに異なる方法で扱います。

このため、read() は、有効な文字コードではない -1 を許可するために、char ではなく整数を返します。-1 以外の値は char にキャストできますが、-1 は EOF を示します。

もちろん、Unicode はマルチバイト文字とコード ポイントでこれらすべてを変更します。それは練習問題として残しておきます。

于 2013-10-09T01:09:04.283 に答える
0

教授が何を意味するのかはわかりませんが、コンピュータは 1 と 0 しか理解できないということです。1 と 0 はすべて理解できません。したがって、コード システムを最初にモリス コードを使用し、次に ascii utf -16 を使用します。 ... 数値 (int) の正確さはコンピューターごとに異なります。実際の int は無限であり、数え続けるだけです。char にもサイズがあります。utf _16 では、16 ビットだとしましょう (あなたはそれを読んでください)したがって、教授が同じ(サイズ)であると言うように char と int の両方が16ビットを取り、1 char を読み取ることは 1int と同じである場合。ちなみにポリティカル・コレクトにはcharも無限大。-1 int は eof char です。

于 2013-10-09T02:03:06.843 に答える