Java IO 是文件讀寫、網絡通信的基礎。本文系統梳理字符流(Reader/Writer)與字節流(InputStream/OutputStream)的核心類、常用模式、緩衝區應用及文本/二進制文件複製實戰,幫助建立清晰的 IO 知識體系。
| 類別 | 抽象基類 | 文件實現類 | 緩衝實現類 |
|---|---|---|---|
| 字符流 | Reader / Writer | FileReader / FileWriter | BufferedReader / BufferedWriter |
| 字節流 | InputStream / OutputStream | FileInputStream / FileOutputStream | BufferedInputStream / BufferedOutputStream |
String path = "/home/user/demo.txt";
FileWriter writer = null;
try {
writer = new FileWriter(path); // 覆蓋模式;追加模式用 new FileWriter(path, true)
writer.write("Hello Java IO\r\n");
writer.flush(); // 強制刷新緩衝區
} catch (IOException e) {
e.printStackTrace();
} finally {
if (writer != null) {
try { writer.close(); } catch (IOException e) { e.printStackTrace(); }
}
}
FileReader reader = new FileReader(path);
// 方式一:單字符讀取
int ch = reader.read();
while (ch != -1) { System.out.print((char)ch); ch = reader.read(); }
// 方式二:循環讀取簡化
int ch2;
while ((ch2 = reader.read()) != -1) { System.out.print((char)ch2); }
// 方式三:讀入字符數組(單次)
char[] buf = new char[1024];
int len = reader.read(buf);
System.out.println(new String(buf, 0, len));
// 方式四:循環讀入數組(推薦大文件)
char[] buf2 = new char[1024];
int len2;
while ((len2 = reader.read(buf2)) != -1) {
System.out.print(new String(buf2, 0, len2));
}
// 方式五:按行讀取(需 BufferedReader)
BufferedReader br = new BufferedReader(new FileReader(path));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
FileReader fr = new FileReader(src);
FileWriter fw = new FileWriter(dest);
char[] buf = new char[1024];
int len;
while ((len = fr.read(buf)) != -1) {
fw.write(buf, 0, len);
}
fw.flush();
// 關閉資源...
BufferedReader br = new BufferedReader(new FileReader(src));
BufferedWriter bw = new BufferedWriter(new FileWriter(dest));
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine(); // 跨平台換行符
}
bw.flush();
// 關閉緩衝區即關閉底層流
FileOutputStream fos = new FileOutputStream(path);
String str = "Hello Bytes\r\n";
fos.write(str.getBytes()); // 字符串轉字節數組
fos.flush();
FileInputStream fis = new FileInputStream(path);
// 方式一:單字節讀取(不適合中文)
int b;
while ((b = fis.read()) != -1) System.out.print((char)b);
// 方式二:數組循環讀取(推薦)
byte[] buf = new byte[1024];
int len;
while ((len = fis.read(buf)) != -1) {
System.out.print(new String(buf, 0, len)); // 注意編碼
}
// 方式三:一次性讀取(小文件,慎用大文件 OOM)
byte[] all = new byte[fis.available()];
fis.read(all);
System.out.println(new String(all));
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(dest);
byte[] buf = new byte[1024];
int len;
while ((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.flush();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest));
byte[] buf = new byte[1024];
int len;
while ((len = bis.read(buf)) != -1) {
bos.write(buf, 0, len);
}
bos.flush();
緩衝區在內存中開闢一塊區域(默認 8KB),讀取時一次性從磁盤填滿緩衝區,後續從緩衝區取數據;寫入時先寫入緩衝區,滿或 flush() 時一次性寫入磁盤。減少系統調用次數,顯著提升大文件讀寫性能。
BufferedReader/Writer、BufferedInputStream/OutputStream。new InputStreamReader(is, "UTF-8")、new OutputStreamWriter(os, "UTF-8"),避免平台默認編碼差異。Java IO 雖類繁多,但核心只有四大抽象基類及其裝飾者模式組合。掌握「字符流處理文本、字節流處理二進制、緩衝流提升性能、try-with-resources 管理資源」四大原則,即可應對絕大多數文件讀寫場景。