在Java編程中, 輸入輸出流(I/O Stream) 是處理數(shù)據(jù)讀寫操作的核心機制。無論是讀取文件、網(wǎng)絡(luò)通信還是用戶交互,都離不開流的概念。小編將深入解析Java輸入輸出流的原理、分類及實際應(yīng)用,幫助開發(fā)者掌握這一關(guān)鍵技術(shù)。
一、什么是輸入輸出流?
輸入輸出流是Java中用于數(shù)據(jù)傳輸?shù)某橄蟾拍睿?/p>
輸入流(InputStream/Reader) :從數(shù)據(jù)源(如文件、網(wǎng)絡(luò))讀取數(shù)據(jù)到程序。
輸出流(OutputStream/Writer) :將程序中的數(shù)據(jù)寫入目標(biāo)(如文件、控制臺)。
流的本質(zhì)是有序的數(shù)據(jù)序列,通過流可以逐字節(jié)或逐字符處理數(shù)據(jù),避免一次性加載全部內(nèi)容,節(jié)省內(nèi)存資源。
二、流的分類
Java I/O流按處理單位分為兩類:
1. 字節(jié)流(Byte Streams)
處理原始二進(jìn)制數(shù)據(jù)(8位字節(jié))。
核心類:
InputStream:抽象輸入字節(jié)流(如FileInputStream)。
OutputStream:抽象輸出字節(jié)流(如FileOutputStream)。
適用場景:圖片、音頻等非文本文件。
示例:文件復(fù)制(字節(jié)流)
try (InputStream in = new FileInputStream("source.jpg");
OutputStream out = new FileOutputStream("copy.jpg")) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead); // 逐字節(jié)復(fù)制
}
} catch (IOException e) {
e.printStackTrace();
}
運行
2. 字符流(Character Streams)
處理Unicode字符(16位),自動處理字符編碼。
核心類:
Reader:抽象輸入字符流(如FileReader)。
Writer:抽象輸出字符流(如FileWriter)。
適用場景:文本文件(如TXT、CSV)。
示例:讀取文本文件(字符流)
try (Reader reader = new FileReader("text.txt");
Writer writer = new FileWriter("output.txt")) {
?。悖瑁幔騕] buffer = new char[128];
int charsRead;
while ((charsRead = reader.read(buffer)) != -1) {
writer.write(buffer, 0, charsRead); // 逐字符寫入
}
} catch (IOException e) {
e.printStackTrace();
}
運行
三、高級流:裝飾器模式的應(yīng)用
Java通過裝飾器模式提供增強功能的流:
緩沖流(Buffered Streams) :減少I/O次數(shù),提升效率。
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = br.readLine()) != null) { // 一次讀取一行
System.out.println(line);
}
}
運行
數(shù)據(jù)流(Data Streams) :直接讀寫基本數(shù)據(jù)類型。
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"))) {
dos.writeInt(100); // 寫入整數(shù)
dos.writeUTF("Hello"); // 寫入字符串
}
運行
對象流(Object Streams) :序列化與反序列化對象。
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.dat"))) {
oos.writeObject(new ArrayList<>()); // 寫入對象
}
運行
四、關(guān)鍵注意事項
資源關(guān)閉:
使用try-with-resources自動關(guān)閉流(Java 7+),避免資源泄漏。
性能優(yōu)化:
優(yōu)先使用緩沖流(如BufferedInputStream),減少磁盤/網(wǎng)絡(luò)訪問次數(shù)。
字符編碼:
指定編碼(如UTF-8)防止亂碼:new InputStreamReader(new FileInputStream("file.txt"), StandardCharsets.UTF_8);
運行
Java輸入輸出流是程序與外部世界溝通的橋梁。理解字節(jié)流與字符流的區(qū)別、掌握裝飾器模式的應(yīng)用,并遵循資源管理最佳實踐,能顯著提升程序的健壯性和效率。隨著NIO(非阻塞I/O)的普及,傳統(tǒng)I/O流仍是Java開發(fā)者必須扎實掌握的基礎(chǔ)技術(shù)。