Java的File類(Java基礎複習歸納系列)
參考資料:THU 諶衛軍教學PPT
目錄
一、檔案
什麼是檔案
-
檔案是一種抽象機制,它提供了一種把資訊儲存在磁碟等儲存裝置上,並且便於以後訪問的方法。
-
在一個作業系統中,負責處理檔案相關事宜的部分,稱為檔案系統。
檔案的屬性
- 每個檔案都有一個名字和它所儲存的資訊,此外,OS還給每個檔案附加了一些其他資訊,這些資訊稱為檔案的屬性。
- 常見的一些檔案屬性:
- 只讀標誌位:可讀/寫或只讀
- 隱藏標誌位:普通檔案或隱藏檔案
- 系統標誌位:普通檔案或系統檔案
- 建立時間、最後訪問時間、最後修改時間
- 檔案長度
- 檔案的建立者、保護資訊等
目錄
- 目錄(directory)也稱資料夾(folder),它是一張表格,記錄了在該目錄下的每一個檔案的檔名和其他的一些管理資訊。
- 一般情況下,每個檔案佔用該表格的某一行,即一個目錄項;
- 這張表格本身是以檔案的形式存放在磁碟上;
- 在目錄的管理上,也有相關的系統呼叫,如:建立目錄、刪除目錄、修改目錄名等
目錄的實現
二、File類
File類的常用方法
- File類用於封裝一個路徑,該路徑可以是從系統碟符開始的絕對路徑,也可以是相對於當前目錄而言的相對路徑
- File類內部封裝的路徑可以指向一個檔案,也可以指向一個目錄,在使用File類操作檔案或者目錄之前,首先得建立一個File物件。建立File物件的構造方法如下所示。
構造方法
File(String pathname) |
通過將給定路徑名字串轉換為抽象路徑名來建立一個File 例項。 |
File(File parent, String child) |
根據父路徑抽象路徑名和子路徑路徑名(包括檔名稱)建立一個 File 物件。 |
File(String parent, String child) |
根據父路徑名字串和子路徑名(包括檔名稱)字串建立一個 File 物件。 |
File(URI uri) |
通過將給定的 file: URI 轉換為一個抽象路徑名來建立一個新的 File 物件。 |
常用方法
原型 |
功能描述 |
String getName() |
得到檔案的名稱(不包括路徑) |
String getPath() |
得到檔案的路徑名 |
String getAbsolutePath() |
得到檔案的絕對路徑名(在 UNIX 系統上,如果路徑名的字首是 "/",那麼該路徑名是絕對路徑名。在Windows系統上,如果路徑名的字首是後跟 "\\" 的碟符,或者是 "\\\\",那麼該路徑名是絕對路徑名)。 |
String getParent() |
得到檔案的上一級目錄名 |
boolean renameTo(File dest) |
將當前檔名修改為dest |
boolean exists() |
測試當前File物件所指示的檔案是否存在 |
boolean canWrite() |
測試檔案是否可寫 |
boolean canRead() |
測試檔案是否可讀 |
boolean isFile() |
判斷當前檔案是否是一個檔案(而非目錄) |
boolean isDirectory() |
判斷當前檔案是否是目錄 |
boolean createNewFile() |
檢查File物件對應的檔案是否存在,若不存在則建立該檔案。建立成功返回true,否則返回false |
long lastModified() |
得到檔案最近一次修改的時間(返回值用與時間點(1970 年 1 月 1 日,00:00:00 GMT)之間的毫秒數表示) |
long length() |
得到檔案的長度,以位元組為單位 |
boolean delete() |
刪除當前檔案或目錄。如果此路徑名錶示一個目錄,則該目錄必須為空才能刪除。成功刪除返回true,否則返回false。 |
String[] list() |
列出當前目錄下的檔案 |
String[] list(FilenameFilter filter) |
返回一個字串陣列,包含此路徑中滿足指定過濾器的檔案和目錄 |
File[] listFiles() |
返回一個包含了File物件所有子目錄和子檔案的File陣列 |
File類的應用
1.遍歷目錄下的檔案
例:獲取某個目錄下指定型別的檔案
list(FilenameFilter filter)方法的工作原理如下所示:
a、呼叫list()方法傳入FilenameFilter檔案過濾器物件
b、取出當前File物件所代表目錄下的所有子目錄和檔案
c、對於每一個子目錄或檔案,都會呼叫檔案過濾器物件的accept(File dir,String name)方法,dir - 被找檔案所在的目錄,name - 檔案的名稱。
d、如果accept()方法返回true,就將當前遍歷的這個子目錄或檔案新增到陣列中,如果返回false,則不新增。
import java.io.*;
public class TestFilenameFilter {
public static void main(String[] args) throws Exception {
// 建立File物件
File file = new File("D:\\");
// 建立過濾器物件
FilenameFilter filter = new FilenameFilter() {
@Override
// 實現accept方法
public boolean accept(File dir, String name) {
File currFile = new File(dir, name);
if (currFile.isFile() && name.endsWith("txt")) {
return true;
} else
return false;
}
};
if (file.exists()) {// 判斷File物件對應的目錄是否存在
String[] lists = file.list(filter);// 獲得過濾後的所有檔名陣列
for (String name : lists) {
System.out.println(name);
}
}
}
}
2.刪除檔案及目錄
File類提供了delete()方法刪除檔案,但該方法無法刪除非空目錄,因此,要想刪除檔案及非空目錄,需要通過遞迴的方式將整個目錄以及其中的檔案全部刪除。
例:編寫一個方法刪除指定目錄,不論其是否為空
import java.io.*;
public class DeleteDir {
static int cntFile = 0;
static int cntDir = 0;
public static void main(String[] args) {
File file = new File("D:\\test");
deleteFileDir(file);
System.out.println("刪除成功,共刪除"+cntFile+"個檔案和"+cntDir+"個資料夾");
}
public static void deleteFileDir(File dir) {
if (dir.exists()) {
File[] files = dir.listFiles();//得到File陣列
for (File file : files) {//遍歷所有的子目錄和檔案
if (file.isDirectory()) {
deleteFileDir(file);//如果是目錄,就遞迴呼叫deleteFileDir()
} else {
file.delete();//如果是檔案,直接刪除
cntFile++;
}
}
// 刪除完一個目錄的所有檔案,就刪除這個目錄
dir.delete();
cntDir++;
}
}
}
上例中定義了一個刪除目錄的靜態方法deleteDir(),接收一個File型別的引數。在這個方法中,呼叫listFiles()方法把這個目錄下所有的子目錄和檔案儲存到一個File型別的陣列files中,然後遍歷files,如果是目錄就重新呼叫deleteDir()方法進行遞迴,如果是檔案就直接呼叫File的delete()方法刪除。當刪除完一個目錄下的所有檔案後,再刪除當前這個目錄,這樣便從裡層到外層遞迴的刪除了整個目錄
相關推薦
Java的File類(Java基礎複習歸納系列)
參考資料:THU 諶衛軍教學PPT 目錄 一、檔案 什麼是檔案 檔案的屬性 目錄 一、檔案 什麼是檔案 檔案是一種抽象機制,它提供了一種把資訊儲存在磁碟等儲存裝置上,並且便於以後訪問的方法。 在一個作業系統中,負責處理檔案相關
Java的Scanner類(Java基礎複習歸納系列)
參考資料:Java doc、THU 諶衛軍老師的教學PPT Scanner類 作用:一個可以使用正則表示式來解析基本型別和字串的簡單文字掃描器。可以方便地對文字檔案中的每一個不同型別的資料單元進行訪問; Scanner 使用分隔
Java的反射機制初步(Java基礎複習歸納系列)
目錄 一、通過反射檢視類資訊 Java程式中的許多物件在執行時都會出現兩種型別:編譯時型別和執行時型別,如Person p = new Student(),p變數編譯時型別為Person,而執行時型別為Student。我們常常需
Java的多執行緒(Java基礎複習歸納系列)
目錄 1.程序 2.執行緒 一、執行緒概述 1.程序 在一個作業系統中,每個獨立執行的程式都可稱之為一個程序,也就是“正在執行的程式”。 程序和程式 A proce
Java常用排序演算法(Java基礎複習四)
一、內部排序 插入排序(直接插入排序、希爾排序) 選擇排序(簡單選擇排序、堆排序) 交換排序(氣泡排序、快速排序) 歸併排序 基數排序 二、外部排序 記憶體外存結合使用 總結:
六類運算子+鍵盤錄入+流程控制語句之順序結構與選擇結構中的if與switch語句部分+練習+面試題(java基礎語法篇二)
一。運算子(對常量和變數進行操作的符號)1.1算術運算子嘗試敲出以下程式碼,看看輸出的結果分別是什麼?相信通過敲出上面程式碼並執行,已經看出 /運算子是取商,而且商是向下取整,%則是取餘數沒理解的話做下下面兩個題試試(答案在下面,先自己計算出答案再敲出來驗證) 第一題答案 9
JAVA基礎複習(三)繼承、多型、抽象類和介面
1、超類也稱為父類或者基類,次類又稱為子類或者拓展類、派生類。子類從它的父類中繼承可訪問的資料域和方法,還可以新增新資料域和新方法。 2、繼承:子類並不是父類的一個子集,子類比它的父類包含更多的資訊和方法;父類中的私有資料域在該類之外是不可訪問的;不是所有是一種關係都應該用繼承來建模,但是繼承是
JAVA基礎複習(二)類、方法、字串
1、類使用變數定義資料域,使用方法定義動作,構造方法為了完成初始化動作 2、構造方法三個特徵:具備和所在類相同的名字;沒有返回值型別,連void也沒有;在建立一個物件使用new操作符時呼叫,可以有多個同名的構造方法要有不同的引數列表 3、引用型資料域預設值是null,數值型資料域預設值是0,
java基礎複習(類和物件)
建構函式(構造器) 1、this() super()都必須是建構函式裡的第一句宣告 若同時出現,那麼原則是: 引數少的構造器用this呼叫引數多的,在引數最多的建構函式裡呼叫 super 靜態變數、靜態方法、常量 static: 被所有的例項共享
java基礎複習(抽象類和介面)
介面中的資料域只能是public static final,方法只能是public abstract 由於這個原因,這些修飾也可以忽略。 資料域只能是static final的原因: stackoverflow上: An interface can’t ha
Java基礎複習第六天——方法的定義、呼叫、形參實參、方法過載、ArrayList類(集合)
一.方法 定義格式: //定義方法:求兩個整數之和 //返回值型別 int //引數:未知量 2個 都是int public static int getSum(int num1,int num2) { //方法體 int sum = num1 + num2;
Java基礎複習筆記--Iterator和ListIterator 迭代器的使用(遍歷集合) Java類集框架——Iterator和ListIterator 迭代器的使用(遍歷集合)
Java類集框架——Iterator和ListIterator 迭代器的使用(遍歷集合) 學習目標: 掌握集合輸出的標準操作。 掌握Iterator介面的主要作用及使用注意事項。 掌握ListIterator與Iterator介面的關係及區別。
JAVA基礎複習(七)多執行緒和網路
1、建立執行緒和任務,如: //任務類必須實現Runnable介面 public class TaskClass implements Runnable{ ... public TaskClass(...){ ... } //想要在該執行緒執行的
JAVA基礎複習(六)泛型和集合
1、泛型的優點是能在編譯時檢測出錯誤,一旦編譯器認為泛型型別是安全使用的,就會將它轉換為原始型別,泛型類或方法允許使用者指定可以和這些類或方法一起工作的物件型別 2、泛型型別必須是引用型別,不能使用int、double等基本型別來替代泛型集合 3、泛型集合類的構造方法和普通類相同,定義一個泛
JAVA基礎複習(四)異常和IO
1、不應該讓方法來終止程式,應該由呼叫者決定是否終止程式,但是又要儘量使用if來進行簡單測試而不是異常處理來測試 2、異常是物件,而物件都採用類來定義,異常的根類是java.lang.Throwable 3、異常類主要分為三種類型:系統錯誤(JAVA虛擬機器丟擲,免檢異常)、異常(要被被捕獲
JAVA基礎複習(一)小細節
1、區別大小寫;小寫字母命名變數和方法,多個單詞,第一個單詞字母小寫,其餘首字母大寫;類名每個首字母大寫;常量所有字母大寫,單詞間使用下劃線連線;$用於機器自動產生的原始碼中。 2、%的計算,只有當被除數是負數時,餘數才是負數 3、整型預設int,浮點預設double,long追加L,flo
Java基礎複習第四天 第三天覆習訓練+Random、Math類、99乘法表
Random類 a.建立物件 Random rd = new Random(); b.呼叫方法 int num = rd.nextInt(x);//生成一個隨機整數 但是必須指定隨機整數的範圍,範圍是 0~x-1 擴充套件:  
java基礎複習(繼承和多型)
繼承中程式碼的執行順序 1.父類靜態物件,父類靜態程式碼塊 2 .子類靜態物件,子類靜態程式碼塊 3.父類非靜態物件,父類非靜態程式碼塊 4.父類建構函式 5.子類非靜態物件,子類非靜態程式碼塊 6.子類建構函式 關於靜態方法的繼承: 老師ppt上: 1、與例
java基礎複習(陣列)
陣列宣告: int[] a, b; // Both a and b are arrays of type int int c[], d; // WARNING: c is an array, but d is just a regular int 陣列初始化
java基礎複習(物件)
字串與數字相互轉換 (double/integer).valueOf(String)-------String.valueOf(double/integer) 氣泡排序(二位陣列) int[] ns={ 1,15,9,52,88