首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java IO 流體系全景圖:從控制台到文件、網絡的數據搬運指南

     編輯:Java 綜合教學

Java IO 流體系全景圖:從控制台到文件、網絡的數據搬運指南

Java IO 核心抽象:**流**——有序數據序列。輸入流讀源,**輸出流**寫目標。java.io 提供字節流(InputStream/OutputStream)與字符流(Reader/Writer)兩大體系,橋樑是 InputStreamReader/OutputStreamWriter。

一、控制台交互

// 字符流包裝系統標準輸入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 讀單字符
int c = br.read(); // 返回 int,-1 表結束
// 讀整行
String line = br.readLine(); // 不含換行符
// 寫控制台
System.out.write('A'); // 字節寫入
System.out.println("Hello"); // 文本寫入(推薦)

二、文件字節流

類構造示例核心方法
FileInputStreamnew FileInputStream("path") / new File(file)read()、read(byte[])、available()、close()
FileOutputStreamnew FileOutputStream("path")(不存在自動創建)write(int)、write(byte[])、close()
// 完整複製示例(二進制安全)
try (FileInputStream in = new FileInputStream("src.dat");
     FileOutputStream out = new FileOutputStream("dst.dat")) {
    byte[] buf = new byte[8192];
    int len;
    while ((len = in.read(buf)) != -1) out.write(buf, 0, len);
}

三、文件字符流(解決中文亂碼)

// 寫入:指定 UTF-8
try (FileOutputStream fos = new FileOutputStream("a.txt");
     OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8")) {
    osw.write("中文輸入\r\nEnglish");
}
// 讀取:同編碼
try (FileInputStream fis = new FileInputStream("a.txt");
     InputStreamReader isr = new InputStreamReader(fis, "UTF-8")) {
    StringBuilder sb = new StringBuilder();
    char[] buf = new char[1024];
    int len;
    while ((len = isr.read(buf)) != -1) sb.append(buf, 0, len);
    System.out.println(sb);
}

四、緩衝流:性能加速器

  • BufferedInputStream/BufferedOutputStream:字節緩衝,減少系統調用。
  • BufferedReader/BufferedWriter:字符緩衝,提供 readLine()、newLine()。
// 高效文本複製
try (BufferedReader br = new BufferedReader(new FileReader("src.txt"));
     BufferedWriter bw = new BufferedWriter(new FileWriter("dst.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        bw.write(line);
        bw.newLine(); // 平台無關換行
    }
}

五、Data 流:基本類型序列化

// 寫基本類型
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"))) {
    dos.writeInt(123);
    dos.writeDouble(3.14);
    dos.writeUTF("Hello");
}
// 讀基本類型(順序必須一致)
try (DataInputStream dis = new DataInputStream(new FileInputStream("data.bin"))) {
    int i = dis.readInt();
    double d = dis.readDouble();
    String s = dis.readUTF();
}

六、File 類:文件/目錄元操作

File f = new File("/tmp/user/java/bin");
f.mkdirs(); // 遞歸創建目錄
File[] files = f.listFiles(); // 列出子項
for (File sub : files) {
    System.out.println(sub.getName() + (sub.isDirectory() ? " [DIR]" : " [FILE]"));
}

七、流體系繼承圖譜(核心)

InputStream (抽象)
├─ FileInputStream
├─ ByteArrayInputStream
├─ FilterInputStream
│  ├─ BufferedInputStream
│  ├─ DataInputStream
│  └─ PushbackInputStream
└─ ObjectInputStream (對象反序列化)

OutputStream (抽象)
├─ FileOutputStream
├─ ByteArrayOutputStream
├─ FilterOutputStream
│  ├─ BufferedOutputStream
│  ├─ DataOutputStream
│  └─ PrintStream (System.out)
└─ ObjectOutputStream (對象序列化)

Reader/Writer 體系結構對應,處理字符編碼轉換。

八、最佳實踐清單

  1. try-with-resources (Java 7+) 自動關閉資源,拒絕手動 close()。
  2. 指定編碼:new InputStreamReader(fis, StandardCharsets.UTF_8),拒絕平台默認編碼。
  3. 緩衝必加:直接操作 FileInputStream 效能極低,務必包裝 BufferedInputStream。
  4. 區分字節/字符:圖片/視頻/二進制用字節流;文本/JSON/XML 用字符流。
  5. 大文件分塊:RandomAccessFile / FileChannel (NIO) 支持斷點續傳、內存映射。

掌握 IO 流體系,是處理文件上傳、報表導出、網絡通訊、配置加載等一切「數據搬運」任務的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved