4

如果这个问题有点简单,我深表歉意,但我对我的教授为什么做出以下声明感到有些困惑:

注意 read() 返回一个整数值。使用 int 作为返回类型允许 read() 使用 -1 来指示它已到达流的末尾。您会记得在您对 Java 的介绍中,int 等于 char,这使得使用 -1 很方便。

教授引用了以下示例代码:

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();
        }
    }
 }
}

这是一门高级 Java 课程,所以很明显在这门课程之前我已经学习了一些入门课程。也许我只是有一个“金发时刻”,但我不明白在什么情况下整数在进行比较时可能等于一个字符。当涉及到 EOF 时,实例方法 read() 返回一个整数值。我完全理解。

任何人都可以阐明粗体的声明吗?

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) 的定义是:

从输入流中读取数据的下一个字节。值字节作为 int 返回,范围为 0 到 255。如果由于到达流的末尾而没有可用的字节,则返回值 -1。

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

char另一方面,Java 中的A表示 Unicode 字符,并被视为 0 到 65535 范围内的整数。(在 C 中,achar是 8 位整数值,0 到 255 或 -128 到 127。 )

请注意,在 Java 中,abyte实际上是 -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,147,483,648,最大值为 2,147,483,647(含)。

由于 char不能为负数(介于 0 和 65,535 之间的数字)并且 int可以为负数,因此该方法返回的可能值是 -1(表示没有剩余)到 65,535(char 的最大值)。

于 2013-10-09T01:09:45.820 回答
1

对于计算机而言,字符只是一个数字(在某些时候可能会映射到字母的图片以显示给用户)。语言通常有一种特殊的字符类型来区分“只是一个数字”和“一个引用字符的数字”,但在内部,它仍然只是某种整数。

read()返回 an的原因int是有“一个额外的值”来表示 EOF。的所有值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';

这两个变量在内存中保存相同的数据,但编译器和 JVM 对它们的处理略有不同。

因此, read() 返回一个整数而不是 char 以允许 -1,这不是有效的字符代码。-1 以外的值可以转换为字符,而 -1 表示 EOF。

当然,Unicode 用多字节字符和代码点改变了这一切。我会把它作为练习留给你。

于 2013-10-09T01:09:04.283 回答
0

我不确定教授的意思,但归根结底是计算机只能理解 1 和 0,我们不理解 1 和 0,所以我们首先使用代码系统 Morris 代码,然后使用 ascii 现在 utf -16 ...它因计算机而异,数字(int)有多准确。你知道在现实世界中,int 是无穷大的,他们只是不断地计数。char 也有一个 size.in utf _16 让我们说它是 16 位(我会让你读了那个)所以如果 char 和 int 都占用 16 位,因为教授说它们是相同的(大小)并且读取 1 char 与 1int 相同。顺便说一句,正确的char也是无限的。汉字法文字符和我刚编但不能发布的字符不支持。所以想想int和char的代码系统。-1 int 是 eof 字符。

于 2013-10-09T02:03:06.843 回答