對于Java程序員來說,在文件的讀與寫方面最基礎的概念就是字節流和字符流。這兩個概念在Java的I/O包中有很多的應用。下面我們來看看它們有什么不同。
字節流
public class ByteStreamExample { public static void main(String[] args) throws IOException { FileInputStream in = new FileInputStream("test.txt"); int c; while ((c = in.read()) != -1) { System.out.print((char) c); } in.close(); } }
當我們讀取文件時,我們使用字節流來處理,因為在硬盤中文件是以二進制數據存儲,需要經過編碼才能被讀取。
字符流
public class CharacterStreamExample { public static void main(String[] args) throws IOException { FileReader in = new FileReader("test.txt"); int c; while ((c = in.read()) != -1) { System.out.print((char) c); } in.close(); } }
當我們讀取文本文件時,我們使用字符流來處理,因為在文本文件中字符是以Unicode編碼方式存儲的。
區別
區別很簡單,字節流是處理8-bit字節的,而字符流是處理16-bit Unicode字符的。在表現形式上,字節流可以處理所有類型的數據(包括文本和二進制數據),而字符流只能處理文本文件。
在Java內部中,字符流實際上是對字節流的一種包裝。它們之間的關系如下圖所示:
+---------------+ | InputStream | +---------------+ ^ | +---------------+ | Reader | +---------------+
除了它們在處理不同類型數據時的差異外,其他方面它們都是相同的,包括其概念、方法和實現等。