2017-09-17 46 views
1

我在this教程中遇到了以下聲明。基於字節和基於字符的Inp​​utStream之間的區別

而一個InputStream在時刻返回一個字節,這意味着在0到255之間的值 (或-1,如果流沒有更多的數據), 在時刻返回一個字符讀取器,這意味着一個值介於0和65535之間(或者如果流沒有更多數據,則爲-1 )。

下面是示例代碼 -

Reader reader = new FileReader("c:\\data\\myfile.txt"); 

int data = reader.read(); 
while(data != -1){ 
    char dataChar = (char) data; 
    data = reader.read(); 
} 

爲InputStream中的代碼相似,以及。代替FileReader & Reader;使用FileInputStream和InputStream。 Reader在InputStream流返回字節時返回char。在這兩種情況下,當我使用諸如「Hello World」之類的字符串進行測試時,它一次只讀取一個字符。超過255的值是什麼,我可以用它來查看這些基於字節和基於字符的輸入之間的差異。

工作計劃

import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.Reader; 

public class ReaderStream { 

    public static void main(String[] args) { 
     String data = "படிகஅமைப்பு"; 
     InputStream input = new ByteArrayInputStream(data.getBytes()); 
     Reader inputStream = new InputStreamReader(input); 

     try { 
      int readData = inputStream.read(); 
      while(readData != -1) { 
       System.out.print((char)readData); 
       readData = inputStream.read(); 
      } 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     System.out.println(""); 

     input = new ByteArrayInputStream(data.getBytes()); 

     try { 
      int readData = input.read(); 
      while(readData != -1) { 
       System.out.print((char)readData); 
       readData = input.read(); 
      } 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

} 

輸出

படிகஅமைப்பு 
பà®à®¿à®à®à®®à¯à®ªà¯à®ªà¯ 
+0

'Reader'和'InputStream'有不同的用途。請使用方法/類他們的目標! '讀者'<->字符數據,'InputStream' <->原始/二進制數據。隨意在螺絲上使用錘子,但不要抱怨(或者問爲什麼它不起作用)。看文章@nullpointer ...指向。 – sruetti

+0

@sruetti我明白不同之處。我剛剛編寫了這個程序來查看inputstream是否返回0到255的值,而Reader是返回值0到65535的Reader。感謝您的輸入。 –

回答

3

從基本多文種平面,這不是在ASCII字符集將做任何Unicode字符。我個人喜歡U +0B87இ(來自泰米爾語)或生物危害標誌U +2623☣。確保您打開的文件以Unicode編碼保存(UTF-8通常是最好的選擇,儘管Java在內部使用UTF-16)。

+0

@PunterVicky雖然聽起來好像你已經掌握了區別,否則,嘗試一個包含ASCII字符*和*非ASCII字符的字符串可能會有幫助。使用InputStream的預期輸出可以很好地再現ASCII碼,非ASCII碼的輸出會被您用泰米爾語看到的那種mojibake所取代。 – Darael

+0

是的,我已經掌握了它。我會嘗試你的建議。再次感謝。 –

相關問題