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"); // 文本寫入(推薦)
| 類 | 構造示例 | 核心方法 |
|---|---|---|
FileInputStream | new FileInputStream("path") / new File(file) | read()、read(byte[])、available()、close() |
FileOutputStream | new 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(); // 平台無關換行
}
}
// 寫基本類型
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 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 體系結構對應,處理字符編碼轉換。
close()。new InputStreamReader(fis, StandardCharsets.UTF_8),拒絕平台默認編碼。FileInputStream 效能極低,務必包裝 BufferedInputStream。RandomAccessFile / FileChannel (NIO) 支持斷點續傳、內存映射。掌握 IO 流體系,是處理文件上傳、報表導出、網絡通訊、配置加載等一切「數據搬運」任務的基石。