在Oracle Java Tutorial中给出的示例中,他们试图将字符读作整数......
为什么以及如何运作?
try {
inputStream = new FileReader("xanadu.txt");
outputStream = new FileWriter("characteroutput.txt");
int c;
while ((c = inputStream.read()) != -1) {
outputStream.write(c);
}
答案 0 :(得分:4)
如果您阅读了char,则没有可用于文件末尾的值。
通过使用更大的类型int
,它可能包含所有可能的字符和另一个符号,这意味着文件结束。
答案 1 :(得分:0)
这是因为字符是整数。每个角色都有一个等效的字符。
答案 2 :(得分:0)
基本上char
是int
。请尝试以下方法:
char c = 'c';
int i = c;
这不会导致编译错误。
答案 3 :(得分:0)
在java的幕后,char
只是一个16位无符号值。 int
是32位无符号值。
chars
是ints
的子集,其值在ASCII表上有意义。
由于这种关系,语法很方便允许两种类型轻松转换为另一种类型。
答案 4 :(得分:0)
好的,如果您阅读Reader
/ Writer
的文档,可以看到以下说明:
作家类 - 写方法
写一个字符。要写入的字符包含在内 在给定整数值的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
其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];
}
因此,第二种情况证明使用更大的数据类型是合理的。
他们在两个类中使用int的原因可能只是一致性。