🔍 開發者資源導航 🔍 |
---|
🏷? 博客主頁: 個人主頁 |
📚 專欄訂閱: JavaEE全棧專欄 |
文件
什么是文件?
廣義:操作系統進行資源管理的一種機制,很多的軟件/硬件資源,抽象成“文件”來進行表示。
狹義:保存在硬盤上的文件
文件種類
二進制文件:
根據馮諾依曼結構,所有的文件都是二進制的。
文本文件:
文本文件是二進制文件中特殊的文件,它的二進制數據恰好可以構成字符,并且翻譯過來可以構成有意義的信息。
區分方法:使用筆記本打開,能看懂的就是文本文件。
絕對路徑和相對路徑
路徑是文件在電腦上的存儲位置,計算機可以通過路徑來找到文件,而路徑又分為絕對路徑和相對路徑。
絕對路徑:
從根路徑到目的文件的完整位置。
D:\Lenovo\Documents
相對路徑:
以某一個路徑為基準的路徑,假設你的基準為下述路徑中的py_code
,那么5.23.py
的相對路徑就是/5.23.py
,code的相對路徑就是./
。
D:\code\py_code\5.23.py
在相對路徑中./
表示上一層目錄,../
表示上兩層目錄(注:沒有.../
)。
正斜杠與反斜杠
在路徑的表達中/
與\
在不同的操作系統作為分隔符來用,在主流的操作系統中/
是最常使用的,但是Windos因為歷史遺留問題使用的是/
來當做路徑分隔符,但是現在的Windos系統兩種分隔符都可以支持。
Java文件操作
java針對文件操作:
- 文件系統操作(刪除、新建、重命名)
- 文件內容操作(針對一個文件的內容進行讀和寫)
方法 | 說明 | 常用場景 |
---|---|---|
boolean exists() | 檢查文件/目錄是否存在 | 操作文件前的安全檢查 |
boolean isFile() | 判斷是否是普通文件 | 區分文件和目錄 |
boolean isDirectory() | 判斷是否是目錄 | 遍歷目錄時檢查 |
String getName() | 獲取文件/目錄名稱 | 獲取文件名(不含路徑) |
String getPath() | 獲取完整路徑字符串 | 顯示或記錄文件路徑 |
String getAbsolutePath() | 獲取絕對路徑 | 需要絕對路徑的場景 |
long length() | 獲取文件大小(字節數) | 檢查文件大小 |
boolean createNewFile() | 創建新空文件 | 需要新建文件時 |
boolean mkdir() | 創建單層目錄 | 新建目錄 |
boolean mkdirs() | 創建多級目錄 | 創建嵌套目錄結構 |
boolean delete() | 刪除文件/空目錄 | 文件清理 |
String[] list() | 列出目錄內容 | 遍歷目錄文件 |
File[] listFiles() | 列出目錄內容(返回File對象) | 需要操作子文件時 |
boolean canRead() | 檢查是否可讀 | 權限檢查 |
boolean canWrite() | 檢查是否可寫 | 權限檢查 |
long lastModified() | 獲取最后修改時間 | 文件監控/同步 |
代碼演示:
public static void main(String[] args) throws IOException {String fileName = "D:/tmp/crashes/a.txt";File file = new File(fileName);//createNewFile如果不存在創建并返回true否則只返回Falseif (file.createNewFile()) {System.out.println(file.exists());System.out.println("創建成功!");} else {System.out.println("文件已存在!");}System.out.println(file.getPath());System.out.println(file.lastModified());}
稍微會用即可,如果工作中有需要再查看API文檔。
進階代碼:查看當前目錄下的所有的文件
public static void main(String[] args) {File file = new File("D:\\code");dfs(file, 0);}public static void dfs(File file, int cnt) {if (file.isDirectory()) {for (int i = 0; i < cnt * 2; i++) {System.out.printf(" ");}System.out.printf(file.getName() + "{\n");for (File f: file.listFiles()) {dfs(f, cnt + 1);}for (int i = 0; i < cnt * 2; i++) {System.out.printf(" ");}System.out.printf("}\n");}else {for (int i = 0; i < cnt * 2; i++) {System.out.printf(" ");}System.out.println(file.getName() + " ");}}//為了輸出好看一些,代碼寫的有點丑哈哈~
流操作
Java 中的文件流操作是 I/O 系統的核心部分,主要用于讀寫文件數據。
流類型 | 特點 | 典型類 |
---|---|---|
字節流 | 以字節(8bit)為單位操作 | InputStream /OutputStream |
字符流 | 以字符(16bit)為單位操作 | Reader /Writer |
緩沖流 | 帶緩沖區的高效流 | BufferedInputStream 等 |
轉換流 | 字節流與字符流轉換 | InputStreamReader 等 |
字節和字符
字節!=字符,一個字符占多少字節由編碼方式決定。例如一個漢字utf-8中占三個字節,而在gbk中占兩個字節。
字節流
// 文件復制(字節流)
try (InputStream in = new FileInputStream("source.txt");OutputStream out = new FileOutputStream("target.txt")) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}
} catch (IOException e) {e.printStackTrace();
}
字符流
// 文本文件讀取(字符流)
try (BufferedReader reader = new BufferedReader(new FileReader("text.txt"))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}
} catch (IOException e) {e.printStackTrace();
}
注意事項
流操作相關的類都需要進行手動關閉,gc雖然能夠管理內存,但是不能自動管理文件,需要咱們手動釋放。如果不釋放就會引起文件資源泄露問題。
因此我們建議使用try-with-resources來進行自動關閉,在try()小括號里面創建并且實現了Closable接口的類都會在結束時自動關閉,而流操作恰好符合這個方式。
try (BufferedReader reader = new BufferedReader(new FileReader("text.txt"))) {//代碼邏輯
}
總結
字符流和字節流的兩個代碼,都是對的,不矛盾的~~字節流讀到的是文件中原始的數據,在硬盤上保存文件的時候,就是6 個字節(utf-8)。
如果是文本文件建議使用字符流,二進制文件建議使用字節流。
感謝各位的觀看Thanks?(・ω・)ノ,如果覺得滿意的話留個關注再走吧。