從File類開始,學習Java文件操作

哈嘍,各位小伙伴們,你們好呀,我是喵手。運營社區:C站/掘金/騰訊云;歡迎大家常來逛逛

??今天我要給大家分享一些自己日常學習到的一些知識點,并以文字的形式跟大家一起交流,互相學習,一個人雖可以走的更快,但一群人可以走的更遠。

??我是一名后端開發愛好者,工作日常接觸到最多的就是Java語言啦,所以我都盡量抽業余時間把自己所學到所會的,通過文章的形式進行輸出,希望以這種方式幫助到更多的初學者或者想入門的小伙伴們,同時也能對自己的技術進行沉淀,加以復盤,查缺補漏。

小伙伴們在批閱的過程中,如果覺得文章不錯,歡迎點贊、收藏、關注哦。三連即是對作者我寫作道路上最好的鼓勵與支持!

哈嘍,各位小伙伴們,你們好呀,我是喵手。

??今天我要給大家分享一些自己日常學習到的一些知識點,并以文字的形式跟大家一起交流,互相學習,一個人雖可以走的更快,但一群人可以走的更遠。

??我是一名后端開發愛好者,工作日常接觸到最多的就是Java語言啦,所以我都盡量抽業余時間把自己所學到所會的,通過文章的形式進行輸出,希望以這種方式幫助到更多的初學者或者想入門的小伙伴們,同時也能對自己的技術進行沉淀,加以復盤,查缺補漏。

小伙伴們在批閱的過程中,如果覺得文章不錯,歡迎點贊、收藏、關注哦。三連即是對作者我寫作道路上最好的鼓勵與支持!

前言

??在Java開發中,文件IO操作是常見的操作之一,而文件操作的基礎就是File類。File類提供了一系列的方法來操作文件和文件夾,它是Java文件和目錄路徑名的抽象表示。

摘要

??在本文中,我們將會深入了解Java中的File類,探究它的應用場景、優缺點,并通過源代碼解析和實際案例來演示如何使用File類。

File類

簡介

在Java中,File類表示一個文件或者目錄的路徑。它提供了創建、刪除、查詢、修改文件和目錄的方法。

File類的構造方法有以下幾種:

  • File(String pathname):通過給定的路徑名字符串創建一個新的File實例。
  • File(String parent, String child):通過給定的父路徑和子路徑字符串創建一個新的File實例。
  • File(File parent, String child):從給定的父抽象路徑名和子路徑名字符串創建一個新的File實例。

File類常用的方法包括:

  • exists():測試此抽象路徑名表示的文件或目錄是否存在。
  • isDirectory():測試此抽象路徑名表示的文件是否為目錄。
  • isFile():測試此抽象路徑名表示的文件是否為標準文件。
  • createNewFile():創建此抽象路徑名指定的新文件。
  • mkdir():創建此抽象路徑名指定的目錄。
  • list():返回一個字符串數組,命名由此抽象路徑名表示的目錄中的文件和目錄。
  • renameTo(File dest):將此抽象路徑名表示的文件重命名為指定的路徑名。

源代碼解析

以下是File類的源代碼:

public class File implements Serializable, Comparable<File> {//字段private final String path;//構造方法public File(String pathname) {if (pathname == null) {throw new NullPointerException();}this.path = fs.normalize(pathname);}//方法public boolean exists() {SecurityManager security = System.getSecurityManager();if (security != null) {security.checkRead(path);}return ((fs.getBooleanAttributes(this) & FileSystem.BA_EXISTS) != 0);}public boolean isDirectory() {SecurityManager security = System.getSecurityManager();if (security != null) {security.checkRead(path);}return ((fs.getBooleanAttributes(this) & FileSystem.BA_DIRECTORY) != 0);}public boolean isFile() {SecurityManager security = System.getSecurityManager();if (security != null) {security.checkRead(path);}return ((fs.getBooleanAttributes(this) & FileSystem.BA_REGULAR) != 0);}//省略其他方法
}

??可以看出,File類的實現非常簡單,主要是對文件、目錄的一些基本操作。實現了Serializable、Comparable 接口。其中包含了一個字段path,表示文件路徑。構造方法用于初始化File對象,被傳入的參數pathname表示文件的路徑。方法中包含了exists()、isDirectory()、isFile()等用于判斷文件是否存在、是否是目錄、是否是文件的方法,并通過調用FileSystem類的方法獲取文件的屬性進行判斷。該代碼還省略了其他方法。

如下是部分源碼截圖:

在這里插入圖片描述

應用場景案例

下面通過一些具體案例,來演示File類的應用場景。

創建目錄

File dir = new File("mydir");
if(!dir.exists()) {dir.mkdir();
}

創建文件

File file = new File("myfile.txt");
if(!file.exists()) {file.createNewFile();
}

刪除文件

File file = new File("myfile.txt");
if(file.exists()) {file.delete();
}

列出目錄下的文件和目錄名

File dir = new File("mydir");
if(dir.isDirectory()) {String[] files = dir.list();for(String fileName : files) {System.out.println(fileName);}
}

拓展:

??這段代碼的作用是遍歷名為"mydir"的文件夾中的所有文件,如果該文件夾存在且是文件夾類型,那么將文件夾中所有文件的文件名打印出來。

具體分析如下:

  1. 創建一個File對象dir,指定文件夾路徑為"mydir"。

  2. 調用isDirectory()方法判斷該File對象對應的路徑是否是一個文件夾,如果是則繼續執行。

  3. 調用list()方法獲取該文件夾中的所有文件名,保存到一個字符串數組中。

  4. 遍歷該字符串數組,對于每一個文件名,將其打印出來。

??注意:該代碼并不會輸出文件夾的名稱,只會輸出文件夾中的文件名。如果需要輸出文件夾名稱,可以將System.out.println(dir.getName())添加到代碼中。

遍歷目錄下的文件和目錄

public static void traverse(File file) {if(file.isFile()) {System.out.println(file.getPath());} else if(file.isDirectory()) {File[] files = file.listFiles();for(File f : files) {traverse(f);}}
}

拓展:

此代碼為遍歷文件系統中的所有文件和文件夾,并打印出所有文件的路徑。

  1. 定義了一個靜態方法 traverse(),傳入參數為 File 類型的文件對象 file
  2. 判斷當前文件對象是否為文件,如果是文件,則打印出其路徑。
  3. 如果不是文件,則判斷其是否為文件夾,如果是文件夾,則獲取該文件夾下所有文件和子文件夾,然后遞歸調用 traverse() 方法,對每個文件或子文件夾進行遍歷操作。
  4. 當最底層的文件對象為文件時,執行步驟 2,打印出其路徑,然后返回上一級執行步驟 3,繼續遍歷其他文件或文件夾。直到遍歷完整個文件系統。

優缺點分析

優點

  • File類提供了豐富的文件和目錄操作方法,方便程序員進行文件IO操作。
  • File類的使用非常簡單,只要提供文件路徑或文件名即可創建文件對象。
  • File類的性能較好,適用于對大文件和目錄的操作。

缺點

  • File類在文件IO操作中對性能和內存的消耗較高,不適用于對大量的小文件的操作。
  • File類無法實現文件鎖定和并發操作,不適用于多線程環境下的文件操作。

類代碼方法介紹

以下是File類中比較重要的方法介紹:

exists()

public boolean exists()

測試此抽象路徑名表示的文件或目錄是否存在。

如果此抽象路徑名表示的文件或目錄存在,則返回 true;否則返回 false。

isDirectory()

public boolean isDirectory()

測試此抽象路徑名表示的文件是否為目錄。

如果此抽象路徑名表示的文件為目錄,則返回 true;否則返回 false。

isFile()

public boolean isFile()

測試此抽象路徑名表示的文件是否為標準文件。

如果此抽象路徑名表示的文件為標準文件,則返回 true;否則返回 false。

createNewFile()

public boolean createNewFile() throws IOException

創建此抽象路徑名指定的新文件。

如果文件已存在,則不創建文件,并返回 false;否則創建一個新文件,返回 true。

mkdir()

public boolean mkdir()

創建此抽象路徑名指定的目錄。

如果目錄已經存在,則不創建目錄,并返回 false;否則創建一個新目錄,返回 true。

list()

public String[] list()

返回一個字符串數組,命名由此抽象路徑名表示的目錄中的文件和目錄。

如果此抽象路徑名不表示一個目錄,則返回 null。

renameTo()

public boolean renameTo(File dest)

將此抽象路徑名表示的文件重命名為指定的路徑名。

如果重命名操作成功,則返回 true;否則返回 false。

測試用例

以下是一些測試用例:

測試目錄創建和刪除

public static void testDirectory() {//測試目錄創建File dir = new File("mydir");if(!dir.exists()) {dir.mkdir();}//測試目錄刪除if(dir.exists()) {dir.delete();}
}

拓展:

??這段代碼定義了一個靜態的方法testDirectory(),用于測試目錄的創建和刪除。具體分析如下:

  1. 創建File對象dir,指定了目錄名為"mydir"。

  2. 判斷目錄是否存在,如果不存在,則使用mkdir()方法創建目錄。

  3. 判斷目錄是否存在,如果存在,則使用delete()方法刪除目錄。

??總體來說,這段代碼主要是為了測試目錄創建和刪除的功能,如果目錄存在,則會刪除目錄,如果不存在,則會創建目錄。

測試文件創建和刪除

public static void testFile() throws Exception {//測試文件創建File file = new File("myfile.txt");if(!file.exists()) {file.createNewFile();}//測試文件刪除if(file.exists()) {file.delete();}
}

拓展:
??如上代碼定義了一個名為testFile的靜態方法,它可能會拋出異常。方法中有以下幾個步驟:

  1. 創建一個名為"myfile.txt"的File對象。
  2. 如果該文件不存在,則使用createNewFile()方法創建該文件。
  3. 如果該文件存在,則使用delete()方法刪除該文件。

??可以看出,該方法的主要作用是測試文件創建和刪除的功能。如果文件創建和刪除正常,代碼將不會拋出異常。否則,如果文件創建失敗或刪除失敗,將會拋出異常。

測試文件重命名

package com.example.javase.se.classes;import java.io.File;/*** @Author ms* @Date 2023-11-05 17:56*/
public class FileTest {public static void testRename() throws Exception {File oldFile = new File("test.txt");if (!oldFile.exists()) {oldFile.createNewFile();}File newFile = new File("newTest.txt");if (oldFile.exists() && !newFile.exists()) {oldFile.renameTo(newFile);}}public static void main(String[] args) throws Exception {testRename();}
}

測試結果

??根據如上測試用例,本地測試結果如下,僅供參考,你們也可以自行修改測試用例或者添加更多的測試數據或測試方法,進行熟練學習以此加深理解。

在這里插入圖片描述

測試代碼分析

??根據如上測試用例,在此我給大家進行深入詳細的解讀一下測試代碼,以便于更多的同學能夠理解并加深印象。

??這是一個簡單的文件操作示例,其中包括了文件的重命名操作。具體過程如下:

  1. 首先創建一個名為"test.txt"的文件對象 oldFile。

  2. 判斷該文件對象是否存在,如果不存在,則通過調用 createNewFile() 方法創建一個新文件。

  3. 創建一個名為"newTest.txt"的新文件對象 newFile,同時判斷 oldFile 是否存在且 newFile 不存在。如果成立,說明可以將 oldFile 重命名為 newFile。

  4. 調用 renameTo() 方法實現重命名操作。

  5. 在 main() 方法中調用 testRename() 方法即可執行文件重命名操作。

??需要注意的是,這里的文件重命名操作是基于文件對象的,需要在同一個目錄下操作。如果需要改變目錄,可以先將原文件復制到新目錄下,然后刪除原文件。

全文小結

??本文介紹了Java中的File類,包括其基本概念、應用場景、優缺點以及常用方法的說明。通過實際案例和源碼分析,我們深入了解了File類的使用方法和內部實現機制。希望本文對初學者有所幫助。

總結

??File類是Java文件和目錄路徑名的抽象表示,它提供了一系列的方法來操作文件和目錄。在文件IO操作中,File類的使用非常廣泛,對于大文件和目錄的操作也具有較好的性能。但在多線程環境下的文件操作和對小文件的操作上,File類存在一些不足。

… …

文末

好啦,以上就是我這期的全部內容,如果有任何疑問,歡迎下方留言哦,咱們下期見。

… …

學習不分先后,知識不分多少;事無巨細,當以虛心求教;三人行,必有我師焉!!!

wished for you successed !!!


??若喜歡我,就請關注我叭。

??若對您有用,就請點贊叭。

??若有疑問,就請評論留言告訴我叭。

… …

文末

好啦,以上就是我這期的全部內容,如果有任何疑問,歡迎下方留言哦,咱們下期見。

… …

學習不分先后,知識不分多少;事無巨細,當以虛心求教;三人行,必有我師焉!!!

wished for you successed !!!


??若喜歡我,就請關注我叭。

??若對您有用,就請點贊叭。

??若有疑問,就請評論留言告訴我叭。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16560.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16560.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16560.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows安裝SQL Server

1、下載 下載網頁&#xff1a;SQL Server 下載 | Microsoft 2022版下載地址&#xff1a;https://go.microsoft.com/fwlink/p/?linkid2215158&clcid0x404&culturezh-tw&countrytw 下載結果&#xff1a;SQL2022-SSEI-Dev.exe 打開選第三個&#xff0c;下載介質&…

自定義Linux命令,顯示docker鏡像、容器信息

1、修改環境變量&#xff08;僅對當前用戶有效&#xff09; vim ~/.bashrc2、給命令取別名 alias dpsdocker ps --format "table{{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}" alias disdocker images#保存并退出 :wq3、讓配置重新生效 source ~/.bashrc4、測試&…

ChatGPT技術演進簡介

chatGPT&#xff08;chat generative pre-train transformer&#xff0c; 可以對話的預訓練trasformer模型&#xff09;&#xff0c;討論點&#xff1a; 1、chatGPT為什么突然火了 2、GPT 1.0、2.0、3.0、3.5 、4和4o區別和特性&#xff0c;在不同應用場景中如何選對模型 3、未…

基于ESP8266的無線通信系統設計

本文介紹了一種基于ESP8266的無線通信系統設計方案。ESP8266是一款功能強大且成本低廉的WiFi模塊&#xff0c;非常適合用于構建無線通信系統。本設計主要圍繞ESP8266模塊的功能特點&#xff0c;闡述了系統的硬件組成、軟件設計以及實際應用示例。 關鍵詞&#xff1a;ESP8266&a…

【docker】倉庫harbor的部署

harbor介紹 Harbor 是一個用于存儲和管理 Docker 鏡像的開源倉庫。它提供了一系列的功能&#xff0c;比如用戶管理、訪問控制、鏡像管理、日志審計和安全掃描等。Harbor 可以作為私有倉庫來使用&#xff0c;也可以與公有倉庫&#xff08;如 Docker Hub&#xff09;集成使用。 …

python數據分析——apply 1

參考資料&#xff1a;活用pandas庫 apply是指把函數同時作用于DataFrame的每一行或每一列。類似于編寫一些跨每行或每列的for循環&#xff0c;并同時調用apply函數。 1、函數 函數是對python代碼進行分組和復用的一種方法。如果某段代碼會被多次使用&#xff0c;并且使用時是需…

JS Lab

如何用 JavaScript 在瀏覽器中彈窗如何在 JavaScript 中制作鼠標滑過按鈕改變背景顏色如何在 JS 中點擊按鈕使數字增加如何在 JS 中循環打印多少次 HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title…

優化FPGA SelectIO接口VREF生成電路

引言&#xff1a;FPGA設計中使用了各種PCB SelectIO?接口VREF生成電路。有時即使在以前的設計中已經成功的在電路板上設計了VREF生成電路&#xff0c;也會在VREF引腳上發現大量噪聲&#xff08;200–400mV&#xff09;。大量VREF噪聲的存在可能導致高性能SelectIO接口&#xf…

瑞昱半導體AMB82 MINI(RTL8735B)Arduino 方法介紹

介紹瑞昱半導體&#xff08;Realtek &#xff09;AMB82-Mini 物聯網 AI開發板 Ameba是一個易于編程的平臺&#xff0c;用于開發各種物聯網應用程序。AMB82 MINI配備了各種外設接口&#xff0c;包括WiFi、BLE、GPIO INT、I2C、UART、SPI、PWM、ADC。通過這些接口&#xff0c;AM…

找出只出現一次的數字

輸入一些數字&#xff0c;每個數字以逗號分隔&#xff0c;其中有一個數字出現1次&#xff0c;其余數字均會出現2次。請找出那個只出現一次的數字! 提示&#xff1a;使用字典的方式實現 # 輸入一些數字&#xff0c;每個數字以逗號分隔 input_nums input("請輸入一些數字…

從0開始學統計-秩和檢驗

1.什么是秩和檢驗&#xff1f; 秩和檢驗&#xff0c;也稱為Wilcoxon 秩和檢驗&#xff0c;是一種非參數統計檢驗方法&#xff0c;用于比較兩個獨立樣本的中位數是否有顯著差異。它不要求數據滿足正態分布假設&#xff0c;因此適用于小樣本或者數據不滿足正態分布假設的情況。 …

51單片機-實機演示(單個數碼管)

仿真單個數碼管鏈接&#xff1a;http://t.csdnimg.cn/BLMut 一。插線 注意P00連接到A 測試代碼為 #include <reg52.h> //此文件中定義了單片機的一些特殊功能寄存器// sbit KEY2 P3^2; // 獨立按鍵2void main() {P0 0x00;while (1) {}…

Spring AOP實現Mapper層查詢返回重新賦值

需求&#xff1a; 針對查詢返回的數據&#xff0c;在數據庫層處理可能會影響到性能&#xff0c;在考慮性能及維護方便的情況下&#xff0c;采用AOP實現 1&#xff0c;自定義注解 import java.lang.annotation.*;/*** 針對 mapper層返回值 按照一定規則進行特殊處理后返回*/ Ta…

Vue學習JSON.parse()與JSON.stringify()對象與字符串互轉

Vue學習JSON.parse(&#xff09;與JSON.stringify(&#xff09;對象與字符串互轉 一、前言1、代碼 一、前言 JSON.parse() 和 JSON.stringify() 是 JavaScript 中用于處理 JSON 數據的兩個方法。 JSON.parse() 方法將一個 JSON 字符串解析為對應的 JavaScript 對象或數組。例…

kaggle競賽實戰3

接前文&#xff0c;本文主要做以下幾件事&#xff1a; 1、把前面處理完的幾個表拼成一個大表 2、做特征衍生&#xff08;把離散特征和連續特征兩兩組合得出&#xff09; # In[89]: #開始拼接表 transaction pd.concat([new_transaction, history_transaction], axis0, ignor…

JAVA實現圖書管理系統(初階)

一.抽象出對象: 1.要有書架&#xff0c;圖書&#xff0c;用戶&#xff08;包括普通用戶&#xff0c;管理員用戶&#xff09;。根據這些我們可以建立幾個包&#xff0c;來把繁雜的代碼分開&#xff0c;再通過一個類來把這些&#xff0c;對象整合起來實現系統。說到整合&#xf…

[數組查找]2.圖解二分查找及其代碼實現

二分查找 二分查找也是一種在數組中查找數據的算法。和線性查找不同&#xff0c;它只能查找已經排好序的數據。二分查找通過比較數組中間的數據與目標數據的大小&#xff0c;可以得知目標數據是在數組的左邊還是右邊。因此&#xff0c;比較一次就可以把查找范圍縮小一半。重復執…

嵌入式進階——舵機控制PWM

&#x1f3ac; 秋野醬&#xff1a;《個人主頁》 &#x1f525; 個人專欄:《Java專欄》《Python專欄》 ??心若有所向往,何懼道阻且長 文章目錄 舵機信號線代碼示例初始化PWM初始化UART打印日志初始化外部中斷Extimain函數 舵機最早用于船舶上實現轉向功能,由于可以通過程序連…

MySQL中, 自增主鍵和UUID作為主鍵有什么區別?

首先我們來看看, 存儲自增主鍵和uuid的數據類型 我們知道, mysql中作為主鍵的通常是int類型的數據, 這個 數據從第一條記錄開始, 從1開始主鍵往后遞增, 例如我有100條數據, 那么根據主鍵排序后, 里面的記錄從上往下一次就是1, 2, 3 ... 100, 但是UUID就不一樣了, UUID是根據特殊…

打卡信奧刷題(21)用Scratch圖形化工具信奧P7071 [CSP-J2020] 優秀的拆分

使用2進制進行拆分是比較好的解決方案&#xff0c;畢竟對于大家來說二進制轉換是非常熟的&#xff0c;如果不會可以參考打卡信奧刷題&#xff08;19&#xff09;用Scratch圖形化工具信奧B3972 [語言月賽 202405] 二進制 題解 &#xff0c;輸出的時候再轉換一下輸出&#xff0c;…