Java中IO流
在Java編程中,IO流(Input/Output Stream)是非常重要的概念,它為程序的輸入和輸出操作提供了一套強大而靈活的機制。本文將詳細介紹Java中IO流的相關內容,包括其基本概念、分類以及常見類的使用示例。
一、基本概念
Java的IO流用于在程序和外部設備(如文件、網絡連接等)之間傳輸數據。簡單來說,它提供了一種將數據看作是流的形式進行處理的機制,數據可以在不同的源和目標之間以流的方式“流動”。例如,從文件中讀取數據可以看作是從文件這個數據源沿著流的方向將數據流入程序,而向文件中寫入數據則是將程序中的數據通過流的方式流出到文件這個目標。
二、IO流的分類
(一)按流向分類
-
輸入流(Input Stream):用于從數據源(如文件、鍵盤等)讀取數據到程序中。例如,當我們需要從文件中讀取內容時,就會使用輸入流來實現。常見的輸入流類有
InputStream
、Reader
。 -
輸出流(Output Stream):用于將程序中的數據寫入到目標(如文件、顯示器等)。比如,當我們要將程序中的數據保存到文件中時,就會用到輸出流。常見的輸出流類有
OutputStream
、Writer
。
(二)按數據傳輸單位分類
- 字節流:以字節為單位進行數據的傳輸和處理。字節流可以處理任何類型的數據,包括二進制數據(如圖像、音頻、視頻等)。在Java中,字節流的基類是
InputStream
和OutputStream
。例如,FileInputStream
和FileOutputStream
就是常用的字節流類,用于對文件進行字節級別的讀寫操作。
下面是一個使用字節流讀取文件內容的簡單示例:
import java.io.FileInputStream;
import java.io.IOException;public class ByteReadStreamExample {public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("test.txt")) {int data;while ((data = fis.read())!= -1) {System.out.print((char) data);}} catch (IOException e) {e.printStackTrace();}}
}
在這個示例中,我們使用FileInputStream
打開文件test.txt
,然后通過循環不斷讀取文件中的字節數據,直到讀取到文件末尾(read
方法返回-1
)。每次讀取一個字節并將其轉換為字符輸出。
- 字符流:以字符為單位進行數據的傳輸和處理。字符流主要用于處理文本數據,它會在內部進行字符編碼和解碼的操作,更適用于處理人類可讀的文本信息。在Java中,字符流的基類是
Reader
和Writer
。例如,FileReader
和FileWriter
就是常用的字符流類,用于對文件進行字符級別的讀寫操作。
下面是一個使用字符流讀取文件內容的簡單示例:
import java.io.FileReader;
import java.io.IOException;public class CharacterReadStreamExample {public static void main(String[] args) {try (FileReader fr = new FileReader("test.txt")) {int data;while ((data = fr.read())!= -1) {System.out.print((char) data);}} catch (IOException e) {e.printStackTrace();}}
}
在這個示例中,我們使用FileReader
打開文件test.txt
,然后通過循環不斷讀取文件中的字符數據,直到讀取到文件末尾。
-
**緩沖流:**字節流中讀取讀入文件是磁盤之間的單字節讀取,這種頻繁的單字節操作會導致大量系統調用降低讀取速度。而緩沖流內部會維護一個緩沖區(在內存中),從緩沖區讀取取數據,每讀滿8kb再通過基本流寫到硬盤上,因為內存之間讀取速度遠大于硬盤之間讀寫,因此相對于字節流大大加快了傳輸速度。相對于字符流,由于字符流本身存在緩沖區,所以效果沒有字節流那么明顯但是性能提升仍然顯著。緩沖流的使用需要將基本流包裝成緩沖流,下面分別展示一下緩沖字符流和緩沖字節流
緩沖字節流
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;public class BufferedByteStreamExample {public static void main(String[] args) {byte[] data = "這是使用緩沖字節流寫入的字節數據。".getBytes();// 寫入字節數據到文件try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("byte.txt"))) {bos.write(data);} catch (IOException e) {e.printStackTrace();}// 從文件中讀取字節數據try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("byte.txt"))) {int byteRead;while ((byteRead = bis.read()) != -1) {System.out.print((char) byteRead);}} catch (IOException e) {e.printStackTrace();}} }
緩沖字符流
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;public class BufferedCharacterStreamExample {public static void main(String[] args) {// 寫入文本到文件try (BufferedWriter writer = new BufferedWriter(new FileWriter("character.txt"))) {writer.write("這是使用緩沖字符流寫入的文本。");writer.newLine();writer.write("第二行文本。");} catch (IOException e) {e.printStackTrace();}// 從文件中讀取文本try (BufferedReader reader = new BufferedReader(new FileReader("character.txt"))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}} }
三、常見的IO流類匯總
以下是一些在Java中常用的IO流類:
流類型 | 抽象基類 | 常見子類 | 說明 |
---|---|---|---|
字節輸入流 | InputStream | FileInputStream 、ByteArrayInputStream 、DataInputStream 等 | 用于從不同數據源讀取字節數據 |
字節輸出流 | OutputStream | FileOutputStream 、ByteArrayOutputStream 、DataOutputStream 等 | 用于向不同目標寫入字節數據 |
字符輸入流 | Reader | FileReader 、BufferedReader 、StringReader 等 | 用于從不同數據源讀取字符數據 |
字符輸出流 | Writer | FileWriter 、BufferedWriter 、StringWriter 等 | 用于向不同目標寫入字符數據 |
四、總結
Java中的IO流提供了一種統一而靈活的方式來處理程序與外部設備之間的數據交互。通過了解不同的分類和使用方法,我們可以根據具體的需求選擇合適的IO流類來完成各種輸入和輸出操作。無論是處理文件、網絡通信還是其他數據交換場景,IO流都是Java編程中不可或缺的一部分。