2012-05-04 60 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的原因可能只是一致性問題。

相關問題