Java IO深入理解File
儲存在變數、陣列和物件中的資料是暫時的,當程式終止時他們就會丟失,
為了能夠永久的儲存程式中建立的資料,需要將他們儲存到硬碟或光碟的檔案中。
而File類關心的是在磁碟上檔案的儲存,File類描述的是一個檔案或資料夾。File類的出現是對檔案系統的中的檔案以及資料夾進行物件的封裝。
可以通過物件的思想來操作檔案以及資料夾,用面向物件的方式處理問題,通過該物件的方法,可以得到檔案或資料夾的資訊方便了對檔案與資料夾的屬性資訊進行操作。
Java IO API中的File類可以讓你訪問底層檔案系統,主要有以下功能點:.檢測檔案是否存在
.讀取檔案長度.重新命名或移動檔案
.刪除檔案.檢測某個路徑是檔案還是目錄
.讀取目錄中的檔案列表注意:
File只能訪問檔案以及檔案系統的元資料。如果想讀寫檔案內容,需要使用位元組流形式的FileInputStream、FileOutputStream或者RandomAccessFile,
或字元流形式的FileReader,FileWriter。
如果你正在使用Java NIO,並且想使用完整的NIO解決方案
你會使用到java.nio.FileChannel(否則你也可以使用File)。
二 檔案路徑分割符
上下級資料夾之間使用分隔符分開:
在Windows中分隔符為'\',在Unix/Linux中分隔符為'/'。跨平臺的目錄分隔符更專業的做法是使用File.separatorChar,
例:new File("C:" + File.separatorChar + "test.txt");
注意,如果是使用"\",則需要進行轉義,寫為"\\"才可以,如果是兩個"\",則寫為"\\\\"。
三 絕對路徑與相對路徑
對於UNIX平臺,絕對路徑名的字首是"/"。相對路徑名沒有字首。
對於Windows平臺,絕對路徑名的字首由驅動器號和一個":"組成,例"c:\\..."。相對路徑沒有碟符字首。
相對路徑:相對路徑是指相對於某位置的路徑,是指相對於當前目錄。
在執行Java程式時,相對路徑為執行java命令時當前所在的目錄。eg:
在不同的路徑下執行java命令執行以下程式,並觀察輸出結果。
File file = new File("a.txt");
System.out.println(file.getAbsolutePath());一般在使用時,建議用絕對路徑,因為相對路徑容易出問題,不好確定到底在什麼地方。
//相對路徑//File file = new File("src/a.txt");
四 File類中常用構造器和方法分析File中的方法很多,大概分可以按以下幾類去分析。
******構造器******
public File(String pathname);
通過將給定路徑來建立一個新File例項。
public File(String parent, String child);根據parent路徑名字串和child路徑名建立一個新File例項。
parent是指上級目錄的路徑,完整的路徑為parent+child。
public File(File parent, String child);
根據parent抽象路徑名和child路徑名建立一個新File例項。parent是指上級目錄的路徑,完整的路徑為parent.getPath()+child。
public File(URI uri);通過將給定的檔案建立一個新檔案例項:URI到一個抽象路徑名,
URI是依賴於系統的,因此這個建構函式執行的轉換也是依賴於系統的。
******建立******createNewFile()
在指定位置建立一個空檔案,成功就返回true,如果已存在就不建立然後返回false。
mkdir()
在指定位置建立目錄,這隻會建立最後一級目錄,如果上級目錄不存在就拋異常。
mkdirs()
在指定位置建立目錄,這會建立路徑中所有不存在的目錄。
renameTo(File dest)
重新命名檔案或資料夾,也可以操作非空的資料夾,檔案不同時相當於檔案的剪下,剪下時候不能操作非空的資料夾。移動/重新命名成功則返回true,失敗則返回false。
******刪除******
delete()
刪除檔案或一個空資料夾,如果是資料夾且不為空,則不能刪除,成功返回true,失敗返回false。deleteOnExit()
在虛擬機器終止時,請求刪除此抽象路徑名錶示的檔案或目錄,保證程式異常時建立的臨時檔案也可以被刪。
******判斷******
exists()檔案或資料夾是否存在。
isFile()是否是一個檔案,如果不存在,則始終為false。
isDirectory()是否是一個目錄,如果不存在,則始終為false。
isHidden()是否是一個隱藏的檔案或是否是隱藏的目錄。
isAbsolute()測試此抽象路徑名是否為絕對路徑名。
******獲取******
getName()獲取檔案或資料夾的名稱,不包含上級路徑。
getPath()返回絕對路徑,可以是相對路徑,但是目錄要指定。
getAbsolutePath()獲取檔案的絕對路徑,與檔案是否存在沒關係。
length()獲取檔案的大小(位元組數),如果檔案不存在則返回0L,如果是資料夾也返回0L。
getParent()返回此抽象路徑名父目錄的路徑名字串;如果此路徑名沒有指定父目錄,則返回null。
lastModified()獲取最後一次被修改的時間。
******資料夾相關******staic File[] listRoots()
列出所有的根目錄(Window中就是所有系統的碟符)。list()
返回目錄下的檔案或者目錄名,包含隱藏檔案。對於檔案這樣操作會返回null。list(FilenameFilter filter)
返回指定當前目錄中符合過濾條件的子檔案或子目錄。對於檔案這樣操作會返回null。listFiles()
返回目錄下的檔案或者目錄物件(File類例項),包含隱藏檔案。對於檔案這樣操作會返回null。listFiles(FilenameFilter filter)
返回指定當前目錄中符合過濾條件的子檔案或子目錄。對於檔案這樣操作會返回null。
從上面可以知道File中方法很多,但是大概功能點在概述中有所描述,
下面正對每類重要功能點進行分析和程式碼演示。
1. 例項化一個java.io.File物件例項化一個File物件,就是呼叫File的構造方法,傳入對應引數建立File物件。
如果指定的路徑不存在,不會拋異常,這時file.exists()返回false。在使用File之前,必須通過構造器建立File物件,程式碼如下:
File file = new File("C:\\mycode\\hello.txt");2.檢測檔案是否存在
當你獲得一個File物件之後,可以檢測相應的檔案是否存在。
當檔案不存在的時候,建構函式並不會執行失敗。通過呼叫exists()方法,可以檢測檔案是否存在,程式碼如下:
File file = new File("C:\\mycode\\hello.txt");boolean fileExists = file.exists();
3. 檔案長度
通過呼叫length()可以獲得檔案的位元組長度,程式碼如下:
File file = new File("C:\\mycode\\hello.txt");long length = file.length();
4. 重新命名或移動檔案
通過呼叫File類中的renameTo()方法可以重新命名(或者移動)檔案,程式碼如下:
File file = new File("C:\\mycode\\hello.txt");boolean success = file.renameTo(new File("C:\\mycode\\hello-rename.txt"));
5.刪除檔案
通過呼叫delete()方法可以刪除檔案,程式碼如下:
File file = new File("C:\\mycode\\hello.txt");boolean success = file.delete();
delete()方法與rename()方法一樣,返回布林值表明是否成功刪除檔案,同樣也會有相同的操作失敗原因。
6.檢測某個路徑是檔案還是目錄
File物件既可以指向一個檔案,也可以指向一個目錄。可以通過呼叫isDirectory()方法,
可以判斷當前File物件指向的是檔案還是目錄。當方法返回值是true時,
File指向的是目錄,否則指向的是檔案,程式碼如下:
File file = new File("C:\\mycode");boolean isDirectory = file.isDirectory();
7.讀取目錄中的檔案列表
通過呼叫list()或者listFiles()方法獲取一個目錄中的所有檔案列表。
list()方法返回當前File物件指向的目錄中所有檔案與子目錄的字串名稱(不會返回子目錄下的檔案及其子目錄名稱)。
listFiles()方法返回當前File物件指向的目錄中所有檔案與子目錄相關聯的File物件(與list()方法類似,不會返回子目錄下的檔案及其子目錄)。
程式碼如下:File file = new File("C:\\mycode");
String[] fileNames = file.list();File[] files = file.listFiles();
因為方法比較多,舉一部分簡單例項,體驗File的使用:
建立檔案eg:
package com.lanhuigu.io.file;
import java.io.File;
import java.io.IOException;
/**
* 在指定位置建立一個空檔案,成功就返回true,如果已存在就不建立然後返回false。
*/
public class TestCreateNewFile {
public static void main(String[] args) {
// 1.指定檔案路徑
File file = new File("C:\\mycode\\test-createNewFile.txt");
try {
// 2.呼叫建立方法建立
boolean b = file.createNewFile();
// 3. 建立檔案結果
System.out.println("createNewFile建立檔案結果:" + b);
} catch (IOException e) {
e.printStackTrace();
}
}
}
刪除檔案或空資料夾eg:
package com.lanhuigu.io.file;
import java.io.File;
/**
* delete()
* 刪除檔案或一個空資料夾,如果是資料夾且不為空,則不能刪除,成功返回true,失敗返回false。
*/
public class TestDelete {
public static void main(String[] args) {
// 指定刪除檔案目錄構建File物件
File file = new File("C:\\mycode\\test-mkdir");
// 呼叫delete()方法
boolean b = file.delete();
// 刪除結果
System.out.println("刪除結果:" + b);
}
}
建立目錄(mkdir)eg:
package com.lanhuigu.io.file;
import java.io.File;
/**
* mkdir():
* 在指定位置建立目錄,這隻會建立最後一級目錄,如果上級目錄不存在就拋異常。
* 建立成功返回true,否則返回false。
*/
public class TestMkdir {
public static void main(String[] args) {
// 指定建立目錄位置
File file = new File("C:\\mycode\\test-mkdir");
// 呼叫mkdir()在指定位置建立目錄
boolean b = file.mkdir();
// 列印建立結果
System.out.println("建立檔案目錄結果:" + b);
}
}
建立完整目錄(mkdirs)eg:
package com.lanhuigu.io.file;
import java.io.File;
/**
* mkdirs()
* 在指定位置建立目錄,這會建立路徑中所有不存在的目錄。
*/
public class TestMkdirs {
public static void main(String[] args) {
// 指定檔案目錄
File file = new File("C:\\mycode\\test\\mkdirs\\hello-file");
// 呼叫mkdirs
boolean b = file.mkdirs();
// 建立結果
System.out.println("建立結果:" + b);
}
}
檔案或列表(list, listFiles)eg:
package com.lanhuigu.io.file;
import java.io.File;
/**
* 列出指定目錄中所有包含的子檔案與子目錄
*/
public class TestListFilesDirs {
public static void main(String[] args) {
// 1. 根據File相應構造器,建立File物件
File file = new File("C:\\mycode");
// 2. 通過list方法得到所包含的所有子目錄與子檔名稱
String[] names = file.list();
// 3. 顯示這些名稱
for (int i = 0; i < names.length; i++) {
System.out.println("檔名稱:" + names[i]);
}
/**
* listFiles:
* 方法返回當前File物件指向的目錄中所有檔案與子目錄
*/
// 4. 分別顯示檔名與資料夾名
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
File myFile = files[i];
if (myFile.isFile()) {
System.out.println("子檔名稱:" + myFile.getName());
} else if (myFile.isDirectory()){
System.out.println("子目錄名稱:" + myFile.getName());
}
}
}
}