???????在Java編程中,文件操作和輸入輸出(IO)處理是必不可少的部分。本文將深入探討Java IO包
中的文件流操作,包括基礎概念、分類、常用類以及實際應用場景。
1. File類
File類是Java IO操作的基礎,它實現了Serializable和Comparable<File>接口。
構造方法
// 通過路徑名創建File對象
File file1 = new File("pathName");// 通過父路徑和子路徑創建
File file2 = new File("parent", "child");// 通過父File對象和子路徑創建
File file3 = new File(parentFile, "child");// 通過URI創建
File file4 = new File(URI uri);
常用方法
1.exists()
:判斷文件/目錄是否存在
2.isFile()
/isDirectory()
:判斷是否為文件/目錄
3.createNewFile()
:創建新文件
4.mkdir()
/mkdirs()
:創建目錄
5.list()
/listFiles()
:列出目錄內容
6.delete()
:刪除文件/目錄
2. 流的分類
Java IO流可以按照不同維度進行分類:
按數據流向
輸入流:用于讀取數據(如讀取配置文件)
輸出流:用于寫入數據(如寫日志文件、導出到表格)
按數據類型
字節流:以byte為單位操作數據
字符流:以char為單位操作數據
分類組合
輸入 | 輸出 | |
---|---|---|
字節流 | InputStream | OutputStream |
字符流 | Reader | Writer |
3. 基礎流類
Java IO提供了四個抽象基類:
InputStream
/OutputStream
:字節流基類Reader
/Writer
:字符流基類
4. 字節流操作
字節流以byte為單位操作數據,可以處理任意類型的文件數據。
基本使用方法
// 1. 聲明流
FileInputStream fis = null;
FileOutputStream fos = null;try {// 2. 創建流fis = new FileInputStream("input.txt");fos = new FileOutputStream("output.txt");// 3. 使用流int data;while ((data = fis.read()) != -1) {fos.write(data);}
} catch (IOException e) {e.printStackTrace();
} finally {// 4. 關閉流try {if (fis != null) fis.close();if (fos != null) fos.close();} catch (IOException e) {e.printStackTrace();}
}
常用字節流類
FileInputStream
/FileOutputStream
:文件字節流,操作文件數據ByteArrayInputStream
/ByteArrayOutputStream
:字節數組流(內存流),操作內存數據
注意:內存流不需要手動關閉,由垃圾回收器負責清理。
5. 字符流操作
字符流提供了更方便高效的字符處理方式,底層仍是字節流,但自動處理字符編碼轉換。
try (FileReader reader = new FileReader("input.txt");FileWriter writer = new FileWriter("output.txt")) {int data;while ((data = reader.read()) != -1) {writer.write(data);}
} catch (IOException e) {e.printStackTrace();
}
注意:字符流只能操作文本文件,不能處理圖片、音頻、視頻等二進制文件。
6. 異常處理
IO操作必須正確處理異常,推薦兩種方式:
方式1:try-catch-finally
FileInputStream fis = null;
try {fis = new FileInputStream("file.txt");// 使用流
} catch (IOException e) {e.printStackTrace();
} finally {if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}
}
方式2:try-with-resource(自動關閉資源)
try (FileInputStream fis = new FileInputStream("file.txt");FileOutputStream fos = new FileOutputStream("output.txt")) {// 使用流// 資源會自動關閉
} catch (IOException e) {e.printStackTrace();
}
7. 增強流
增強流提供更高級的功能和操作,通常包裝在基礎流之上。
緩沖流(高效流)
緩沖流通過在內存中創建緩沖區,減少實際IO操作次數,提高效率。
// 字節緩沖流
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = bis.read(buffer)) != -1) {bos.write(buffer, 0, bytesRead);}
}// 字符緩沖流
try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"));BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {String line;while ((line = reader.readLine()) != null) {writer.write(line);writer.newLine();}
}
標準流
Java預定義了三個標準流:
System.in
:標準輸入流(字節流,通常是鍵盤輸入)System.out
:標準輸出流(字節流,通常是控制臺輸出)System.err
:標準錯誤流(字節流,輸出錯誤信息)
// 使用Scanner讀取標準輸入
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();// 標準輸出
System.out.println("普通信息");
System.err.println("錯誤信息");
轉換流
轉換流用于在字節流和字符流之間進行轉換,并可指定編碼。
try (InputStreamReader isr = new InputStreamReader(new FileInputStream("input.txt"), "UTF-8");OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF-8")) {int data;while ((data = isr.read()) != -1) {osw.write(data);}
}
對象流
對象流用于序列化和反序列化Java對象。
// 需要序列化的類必須實現Serializable接口
class Person implements Serializable {private static final long serialVersionUID = 1L;private String name;private transient int age; // transient修飾的字段不會被序列化// 構造方法、getter和setter
}// 序列化對象
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"))) {oos.writeObject(new Person("張三", 25));
}// 反序列化對象
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"))) {Person person = (Person) ois.readObject();System.out.println(person.getName());
}
注意:serialVersionUID
用于確保序列化兼容性,建議顯式定義。
數據流
數據流專門用于讀寫基本數據類型和字符串。
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.dat"))) {dos.writeInt(100);dos.writeDouble(3.14);dos.writeUTF("Hello");
}try (DataInputStream dis = new DataInputStream(new FileInputStream("data.dat"))) {int i = dis.readInt();double d = dis.readDouble();String s = dis.readUTF();
}
8. 隨機訪問流
RandomAccessFile
類允許對文件進行隨機訪問,集輸入輸出于一體。
try (RandomAccessFile raf = new RandomAccessFile("file.txt", "rw")) {// 定位到文件末尾raf.seek(raf.length());// 寫入數據raf.writeUTF("追加的內容");// 定位到文件開頭raf.seek(0);// 讀取數據String content = raf.readLine();
}
9. 實際應用場景
寫日志:使用字符輸出流(如FileWriter)記錄程序運行日志
讀寫配置文件:使用Properties類結合文件流讀寫配置文件
文件上傳下載:使用字節流處理文件傳輸
數據持久化:使用對象流將對象序列化到文件中
大數據處理:使用緩沖流提高大文件讀寫效率
總結
Java IO提供了豐富的API來處理文件和數據流操作。在實際開發中,應根據具體需求選擇合適的流類型:
處理文本文件:優先考慮字符流
處理二進制文件:使用字節流
需要高效讀寫:使用緩沖流
需要對象持久化:使用對象流
需要隨機訪問:使用RandomAccessFile
正確使用和關閉流資源是避免內存泄漏和資源耗盡的關鍵,推薦使用try-with-resources語句確保資源正確釋放。
掌握Java IO操作對于開發高效、穩定的應用程序至關重要,希望本文能為您提供全面的指導和參考。