在 Java 編程中,IO(輸入輸出)操作是處理文件和數據流的核心部分。本文將圍繞文件系統、硬盤存儲、Java 的?File
?類以及?InputStream
?和?OutputStream
?的使用進行詳細總結,幫助讀者全面掌握 Java IO 編程的核心知識。
一、IO、存儲與文件系統基礎
1. 存儲設備與硬盤
-
硬盤:計算機的主要存儲設備,分為機械硬盤(HDD)和固態硬盤(SSD)。
-
存儲單位:字節(Byte)、千字節(KB)、兆字節(MB)、g字節(GB)等。
-
讀寫速度:SSD 的讀寫速度遠高于 HDD,但價格更貴。
2. 文件系統
-
文件系統:操作系統用于管理文件和目錄的機制,常見的有 NTFS(Windows)、EXT4(Linux)、APFS(macOS)。
-
文件與目錄:文件是數據的集合,目錄是文件的容器。
-
路徑:文件或目錄在文件系統中的位置,分為絕對路徑和相對路徑。
二、Java 中的?File
?類
File
?類是 Java 中用于表示文件和目錄路徑名的抽象表示。它可以用于創建、刪除、重命名文件和目錄,以及查詢文件屬性。
1. 創建?File
?對象
java
復制
File file = new File("example.txt"); // 相對路徑 File dir = new File("/path/to/directory"); // 絕對路徑
2. 常用方法
方法 | 作用 |
---|---|
exists() | 判斷文件或目錄是否存在。 |
isFile() | 判斷是否為文件。 |
isDirectory() | 判斷是否為目錄。 |
createNewFile() | 創建新文件。 |
mkdir() | 創建單級目錄。 |
mkdirs() | 創建多級目錄。 |
delete() | 刪除文件或空目錄。 |
listFiles() | 返回目錄下的文件和子目錄。 |
getPath() | 獲取文件或目錄的路徑。 |
getAbsolutePath() | 獲取文件或目錄的絕對路徑。 |
getName() | 獲取文件或目錄的名稱。 |
length() | 獲取文件大小(字節數)。 |
示例:遍歷目錄
java
復制
File dir = new File("/path/to/directory"); if (dir.isDirectory()) {for (File file : dir.listFiles()) {System.out.println(file.getName());} }
三、Java 中的流操作
Java 的 IO 流分為字節流和字符流,本文重點介紹字節流(InputStream
?和?OutputStream
)。
1.?InputStream
(字節輸入流)
InputStream
?是所有字節輸入流的基類,用于從數據源(如文件、網絡)讀取字節數據。
常用方法
方法 | 作用 |
---|---|
read() | 讀取一個字節,返回 -1 表示結束。 |
read(byte[] b) | 讀取字節到數組,返回實際讀取的字節數。 |
close() | 關閉流,釋放資源。 |
示例:讀取文件內容
java
復制
try (InputStream in = new FileInputStream("example.txt")) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {System.out.write(buffer, 0, bytesRead);} } catch (IOException e) {e.printStackTrace(); }
2.?OutputStream
(字節輸出流)
OutputStream
?是所有字節輸出流的基類,用于將字節數據寫入目標(如文件、網絡)。
常用方法
方法 | 作用 |
---|---|
write(int b) | 寫入一個字節。 |
write(byte[] b) | 寫入字節數組。 |
flush() | 刷新緩沖區,強制寫入數據。 |
close() | 關閉流,釋放資源。 |
示例:寫入文件內容
java
復制
try (OutputStream out = new FileOutputStream("example.txt")) {String data = "Hello, World!";out.write(data.getBytes());out.flush(); } catch (IOException e) {e.printStackTrace(); }
3. 緩沖流(BufferedInputStream/BufferedOutputStream)
為了提高 IO 性能,Java 提供了緩沖流,通過在內存中緩存數據,減少對底層設備的直接操作。
示例:使用緩沖流
java
復制
try (InputStream in = new BufferedInputStream(new FileInputStream("example.txt"));OutputStream out = new BufferedOutputStream(new FileOutputStream("output.txt"))) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);} } catch (IOException e) {e.printStackTrace(); }
四、常見問題與面試題
1.?File
?類能直接操作文件內容嗎?
-
答案:不能。
File
?類只能操作文件元數據(如路徑、大小、權限等),文件內容需要通過流操作。
2.?字節流與字符流的區別?
-
字節流:以字節為單位操作數據,適用于二進制文件(如圖片、視頻)。
-
字符流:以字符為單位操作數據,適用于文本文件(如?
.txt
、.csv
)。
3.?如何高效地復制大文件?
-
答案:使用緩沖流(如?
BufferedInputStream
?和?BufferedOutputStream
),減少 IO 操作次數。
4.?try-with-resources
?的作用是什么?
-
答案:自動關閉資源(如流),避免資源泄漏。適用于實現了?
AutoCloseable
?接口的類。
五、總結
Java 的 IO 操作是處理文件和數據的核心工具,主要包括以下內容:
-
File
?類:用于操作文件和目錄的元數據。 -
字節流:
InputStream
?和?OutputStream
?用于讀寫字節數據。 -
緩沖流:通過緩存提高 IO 性能。
-
文件系統:理解文件系統的基本概念有助于更好地管理文件和目錄。
在實際開發中,建議使用?try-with-resources
?語句管理資源,并結合緩沖流提高 IO 效率。通過掌握這些知識,可以輕松應對文件操作和數據流處理的編程需求。