2012-05-04 40 views
0

Oracle Java Tutorial给出的例子中,他们试图将字符看作整数......。为什么字符流读取int?

为什么和如何运作的?

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

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

...因为计算机中几乎所有的东西都是数字的,这里的数字恰好对应于字符序数? – KeithS

+0

哇,非常感谢您的所有快速答案!这帮了我很多! – kwoebber

回答

4

如果您读取了char,那么您将无法使用文件结尾的值。

通过使用更大的类型int,其可以具有每一个可能的字符与另一个符号,这意味着文件的末尾。

0

这是因为字符是整数。每个角色都有一个相同的unicode。

+0

我认为你错了。字符(Java)短于整数,据我所知。布特也许我错了。我会检查。 – Aslan986

+1

@Aslan986字符是16位,整数是32 –

0

基本上一个charint。请尝试以下操作:

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

这不会导致编译错误。

0

Java中的幕后,一char仅仅是一个16位无符号值。 int是一个32位无符号值。

charsints一个子集,其值都在ASCII表意。

由于这种关系,它是用于语法以允许两种类型的能够容易地转换为其它便利。

0

好吧,如果你读Reader/Writer你可以看到下面的说明文件:

作家班 - 写方法

写入单个字符。要写入的字符在给定整数值的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的原因可能只是一致性问题。

相关问题