如果这个问题有点过分,我很抱歉,但我有点疑惑为什么我的教授做了以下陈述:
请注意,read()返回一个整数值。使用int作为返回类型允许read()使用-1来表示它已到达流的末尾。 你会从你对Java的介绍中回想一下,int等于一个使用-1方便的char。
教授正在引用以下示例代码:
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课程,所以很明显我在这之前已经学过一些入门课程。也许我只是有一个“金发时刻”的各种各样,但我不理解在进行比较时整数可能等于一个字符。实例方法read()在EOF时返回一个整数值。我完全理解。
任何人都可以用粗体来阐明声明吗?
答案 0 :(得分:5)
在Java中,chars是一种更具体的int类型。我可以写。
char c = 65;
此代码打印出“A”。我需要在那里进行转换,因此Java知道我想要字符表示而不是整数。
public static void main(String... str) {
System.out.println((char) 65);
}
您可以在ASCII table.
中查找int到字符映射根据你的老师,int允许更多的价值观。由于-1不是字符值,因此它可以作为标志值。
答案 1 :(得分:1)
对于计算机,角色只是一个数字(可能在某些时候被映射到一个字母的图片以显示给用户)。语言通常有一个特殊的字符类型来区分“只是一个数字”和“一个引用一个字符的数字”,但在内部,它仍然只是某种整数。
read()
返回int
的原因是要有“一个额外的值”来表示EOF。 char
的所有值都已定义为其他值,因此它使用更大的类型来获取更多值。
答案 2 :(得分:1)
这意味着你的教授花了太多时间用C编程。read
{和InputStream
FileInputStream
的定义是:
从输入流中读取下一个数据字节。值字节作为int返回,范围为0到255.如果没有字节可用,因为已到达流的末尾,则返回值-1。
(见http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read())
另一方面,Java中的char
表示Unicode字符,并被视为0到65535范围内的整数。(在C中,char
是8位积分值,0到255或-128到127。)
请注意,在Java中,byte
实际上是-128到127范围内的整数;但是read
的定义已被指定为避免该问题,通过判断它无论如何都会返回0到255。 javadoc在这里松散地使用“byte”。
答案 3 :(得分: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(一个字符的最大值)。
答案 4 :(得分: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以外的值可以强制转换为char,而-1表示EOF。
当然,Unicode会使用多字节字符和代码点来改变所有这些。我会把它作为练习留给你。
答案 5 :(得分:0)
我不确定教授的意思是什么,但这一切归结为计算机只能理解1和0我们不理解1和0所有我们将使用代码系统首先使用Morris代码然后ascii现在utf -16 ......从计算机到计算机的不同,数字(int)是多么准确。你知道在现实世界中int是infinate它们只是保持count.char也有一个size.in utf _16让我们说它是16位(我会让你读到这一点)所以如果char和int都取16位,因为教授说它们是相同的(大小)并且读取1个字符与1int相同。顺便说一下,政治上正确的char也是无限的。中文字符法语字符和我刚刚编写的字符但不能发布导致它不受支持。所以想到int和char的代码系统。 -1 int是eof char。(eof =文件结尾)祝你好运,我希望这有所帮助。我不明白是在读取和写入同一个文件?