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

Java IO 操作總結(一):字符流與字節流基礎

     編輯:Java 程式設計入門

前言

Java IO 是文件讀寫、網絡通信的基礎。本文系統梳理字符流(Reader/Writer)與字節流(InputStream/OutputStream)的核心類、常用模式、緩衝區應用及文本/二進制文件複製實戰,幫助建立清晰的 IO 知識體系。

一、核心體系概覽

類別抽象基類文件實現類緩衝實現類
字符流Reader / WriterFileReader / FileWriterBufferedReader / BufferedWriter
字節流InputStream / OutputStreamFileInputStream / FileOutputStreamBufferedInputStream / BufferedOutputStream

選擇原則

  • 字符流:處理文本文件(.txt, .java, .xml, .json 等),自動處理字符編碼轉換。
  • 字節流:處理二進制文件(圖片、音視頻、壓縮包等),不進行編碼轉換,直接操作字節。

二、字符流實戰

1. 寫入文本文件

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(); }
    }
}

2. 讀取文本文件(五種方式)

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);
}

3. 文本文件複製

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();
// 關閉資源...

4. 緩衝區複製(高效、按行處理)

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();
// 關閉緩衝區即關閉底層流

三、字節流實戰

1. 寫入二進制文件

FileOutputStream fos = new FileOutputStream(path);
String str = "Hello Bytes\r\n";
fos.write(str.getBytes()); // 字符串轉字節數組
fos.flush();

2. 讀取二進制文件

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));

3. 二進制文件複製(圖片、MP3 等)

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();

4. 緩衝字節流複製

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() 時一次性寫入磁盤。減少系統調用次數,顯著提升大文件讀寫性能。

五、最佳實踐建議

  1. 優先使用緩衝流:BufferedReader/Writer、BufferedInputStream/OutputStream。
  2. 資源管理用 try-with-resources (Java 7+):自動關閉,代碼更簡潔安全。
  3. 指定字符編碼:new InputStreamReader(is, "UTF-8")、new OutputStreamWriter(os, "UTF-8"),避免平台默認編碼差異。
  4. 大文件分塊處理:避免一次性讀入內存導致 OOM。
  5. 區分字符/字節流:文本用字符流,二進制用字節流。

總結

Java IO 雖類繁多,但核心只有四大抽象基類及其裝飾者模式組合。掌握「字符流處理文本、字節流處理二進制、緩衝流提升性能、try-with-resources 管理資源」四大原則,即可應對絕大多數文件讀寫場景。

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