Java File類學習筆記2:File類對象及常用操作方法,file學習筆記
一、 檔案、相對路徑與絕對路徑
1.檔案
(1)標準檔案:就像圖片,音樂檔案等。
(2)目錄檔案:也就是平常所說的檔案夾。
(3)虛擬記憶體檔案:系統在運行程式時產生的臨時性檔案。
2.檔案的路徑
(1)相對路徑:相對於某一檔案的路徑,形象地說是把兩檔案的絕對路徑相同的部分砍掉,剩下的就是相對路徑
如:
A檔案是"D:\MyDocuments\StudySample\src\cn\xmh",
B檔案是"D:\MyDocuments\StudySample\src\netjava\cjl",
則B相對A的路徑是"\netjava\cjl";
(2)絕度路徑:從磁碟根目錄算起的路徑名
如:"G:\TDDOWNLOAD\資料結構"
3.關於系統路徑分隔字元
在Windows中,使用反斜線“\”作為路徑分割符,比如“c:\test”,但是Java中反斜線表示轉義,所以需要用“C:\\test”在程式中來表示路徑。還可以使用“C:/test”進行路徑的表示,這種表示方法在linux中也適用。
同時也可以使用File類中定義的常量separator來代替路徑分割符,這樣在各個系統中都可以使用。
如File file = new File("c:" + File.separator + "test.txt”);
單獨的separater表示根的意思,如果在根下建立檔案,相當於在程式路徑的根路徑下建立檔案。
二、File類對象及常用操作方法
1.最常用的一種,根據字串型的路徑名建立檔案對象
在整個IO包中,唯一表示與檔案本身有關的類就是File類。我們可以用File類建立檔案對象,並對檔案對象進行各種操作,
publicFile(String pathname)執行個體化File類的時候,必須設定好路徑
樣本:
import java.io.File;public class FileDemo {public static void main(String[] args) {// 建構函式File(String pathname)File f1 = new File("d:\\daxiang\\1.txt");// File(String parent,String child)File f2 = new File("d:\\daxiang", "2.txt");// File(File parent,String child)File f3 = new File("d:" + File.separator + "abc");// separator 跨平台分隔字元File f4 = new File(f3, "3.txt");System.out.println(f1);// d:\daxiang\1.txtSystem.out.println(f2);// d:\daxiang\2.txtSystem.out.println(f3);// d:\abcSystem.out.println(f4);// d:\abc\3.txt}}
注意:在使用File類指定路徑的時候一定要注意作業系統間的差異,盡量使用separator進行分割
2.檔案對象操作方法
要想使用File類,則首先要觀察File類的方法,此類的常用方法如下所示:
上面表格中只列出了常用方法的的一部分,下面再分類列舉出常用的方法:
建立方法
(1)boolean createNewFile() //用來建立標準檔案的方法
使用File file = new File(path)只是指定了檔案建立的路徑,但是檔案還沒有產生,另外如果路徑不存在,那麼檔案將不會建立成功
(2)boolean mkdir() //建立目錄:根據File對象的名字(路徑)建立一個目錄(檔案夾),如果是相對目錄,則建立的目錄在目前的目錄下
(3)boolean mkdirs() //建立多級目錄:如果File對象名字有多級目錄,則可以調用該方法一次性建立多級目錄
mkdirs()可以建立多級檔案夾(目錄), mkdir()只能建立一層目錄
如:
Filefile = new File("c:/aa");
file.mkdir(); //這樣可以在c:/下建立aa目錄
假如有多層目錄,則不能用mkdir建立,如:
Filefile = new File("c:/aa/bb");
file.mkdir() //這樣建立不了.
這樣不會建立任何目錄, 因為找不到/tmp/one/two目錄, 結果返回false
應該改為:mkdirs()
刪除方法
(1)boolean delete()
(2)boolean deleteOnExit() //檔案使用完成後刪除
判斷方法
(1)boolean canExecute() //判斷檔案是否可執行
(2)boolean canRead() //判斷檔案是否可讀
(3)boolean canWrite() //判斷檔案是否可寫
(4)boolean exists() //判斷檔案是否存在
(5)boolean isDirectory() //判斷File對象指向的檔案是否為目錄,返回一個boolean類型的值,true或者false
(6)boolean isFile() //判斷File對象指向的檔案是否是標準檔案,返回一個boolean類型的值,true或者false
(7)boolean isHidden()
(8)boolean isAbsolute() //判斷是否是絕對路徑 檔案不存在也能判斷
擷取方法
(1)StringgetName() //擷取檔案的名字(不帶檔案的路徑),返回的是String類型的值
(2)String getPath()
(3)String getAbsolutePath()
(4)String getParent() //如果沒有父目錄返回null
(5)long lastModified() //擷取最後一次修改的時間
(6)long length() //得到File對象指向檔案的長度,以位元組計算,返回一個長整形的值(long)
注意:在系統中,檔案夾(目錄)的大小為零,也就是不佔用空間,使用length()時返回的是0
(7)boolean renameTo(File f) //重新命名此抽象名稱指定的檔案
f-- 新抽象路徑名的抽象路徑名,如果重新命名成功此方法返回true,否則返回false
(8)File[] listRoots() //返回抽象路徑名數組,表示在目錄中此抽象路徑名表示,滿足指定過濾器的檔案和目錄。
(9)String[] list()
(10)String[] list(FilenameFilter filter)
各個方法的簡單實現如下:
import java.io.File;public class FileExercise {public static void main(String[] args) throws Exception {System.out.println("當前作業系統的名稱分隔字元是:" + java.io.File.separator);System.out.println("當前作業系統的路徑分隔字元是:" + java.io.File.pathSeparator);// 字串類型的檔案名稱String fileName = "daxiang.txt";// 執行個體化檔案對象File file = new File("src", fileName);File file1 = new File("D:\\daxiang\\testjava\\src\\txt");File file2 = new File("D:\\daxiang\\testjava\\src");// 建立一個檔案file.createNewFile(); //注意file是抽象路徑,此時會在當前java工程下的src檔案夾下建立一個daxiang.txt檔案boolean b;// 申明一個boolean類型的變數// 測試應用程式是否可以執行該檔案b = file.canExecute();System.out.println("測試應用程式是否可以執行該檔案" + b);// 測試用用程式是否可以讀取該檔案b = file.canRead();System.out.println("測試用用程式是否可以讀取該檔案" + b);// 測試用用程式是否可以修改該檔案b = file.canWrite();System.out.println("測試用用程式是否可以修改該檔案" + b);// 測試此抽象路徑名表示的檔案或目錄是否存在。b = file.exists();System.out.println("測試此抽象路徑名表示的檔案或目錄是否存在" + b);// 按字母順序比較兩個抽象路徑名int i = file.compareTo(file1); //compareTo方法,返回參與比較的前後兩個字串的ASCII碼的差值System.out.println(i);String path;// 返回此抽象路徑名的絕對路徑名字串path = file.getAbsolutePath();System.out.println(path);// 返回此抽象路徑名的規範路徑名字串path = file.getCanonicalPath();System.out.println(path);long free;// 返回此抽象路徑名指定的分區中未分配的位元組數free = file.getFreeSpace();System.out.println("此抽象路徑名指定的分區中未分配的位元組數" + free);// 返回由此抽象路徑名表示的檔案或目錄的名稱String name;name = file.getName();System.out.println(name);name = file1.getName();System.out.println(name);// 返回此抽象路徑名父目錄的路徑名字串;如果此路徑名沒有指定父目錄,則返回 nullString parentpath;parentpath = file.getParent();System.out.println(parentpath);parentpath = file1.getParent();System.out.println(parentpath);// 返回此抽象路徑名指定的分區上可用於此虛擬機器的位元組數free = file.getUsableSpace();System.out.println("此抽象路徑名指定的分區上可用於此虛擬機器的位元組數" + free);// 計算此抽象路徑名的雜湊碼i = file.hashCode();System.out.println(i);// 測試此抽象路徑名是否為絕對路徑名b = file.isAbsolute();System.out.println("file對象的抽象路徑名是否為絕對路徑名:" + b);b = file1.isAbsolute();System.out.println("file1對象的抽象路徑名是否為絕對路徑名:" + b);// 返回此抽象路徑名表示的檔案最後一次被修改的時間long time = file.lastModified();System.out.println(time);// 返回由此抽象路徑名表示的檔案的長度long length = file.length();System.out.println("檔案的長度:" + length);System.out.println();// 注意list()和listFile()的區別// list()-->返回一個字串數組,這些字串指定此抽象路徑名表示的目錄中的檔案和目錄String[] array1 = file2.list();for (i = 0; i < array1.length; i++) {System.out.println(array1[i]);}System.out.println();// listFiles()-->返回一個抽象路徑名數組,這些路徑名表示此抽象路徑名表示的目錄中的檔案File[] array2 = file2.listFiles();for (i = 0; i < array2.length; i++) {System.out.println(array2[i]);}System.out.println();// listRoots()-->列出可用的檔案系統根,靜態方法File[] roots = File.listRoots();for (i = 0; i < roots.length; i++) {System.out.println(roots[i]);}System.out.println();// 在虛擬機器終止時,請求刪除此抽象路徑名表示的檔案或目錄。// file.deleteOnExit();// 建立此抽象路徑名指定的目錄file1.mkdir();// 重新命名此抽象路徑名表示的檔案File file4 = new File("src\\重新命名檔案");System.out.println(file1.renameTo(file4));// 設定檔案唯讀file.setReadOnly();// 設定檔案可寫file.setWritable(true);}}
三、File類常用操作執行個體
<span style="font-size:14px;">/** * 執行個體操作一:建立一個新檔案 * 在D盤建立一個test.txt檔案 */import java.io.File;import java.io.IOException;public class FileOperate {public static void main(String[] args) {File f = new File("d:" + File.separator + "test.txt");// 為增加可移植性,建議使用File.separatortry {f.createNewFile();} catch (IOException e) {e.printStackTrace();}}}/** * 執行個體操作二:刪除一個指定檔案 * 刪除剛剛在D盤建立的test.txt檔案 */import java.io.File;public class FileOperate {public static void main(String[] args) {File f = new File("d:" + File.separator + "test.txt");if (f.exists()) {// 判斷檔案存不存在,如不存在就不用刪除了f.delete();}}}/** * 執行個體操作三:綜合建立、刪除檔案的操作 * 給定一個路徑,如果此檔案存在,則刪除,如果不存在,則建立 */import java.io.File;import java.io.IOException;public class FileOperate {public static void main(String[] args) {File f = new File("d:" + File.separator + "test.txt");if (f.exists()) {f.delete();} else {try {f.createNewFile();} catch (IOException e) {e.printStackTrace();}}}}/** * 執行個體操作四:建立一個檔案夾 * 使用mkdir()方法建立一個檔案夾 */import java.io.File;public class FileOperate {public static void main(String[] args) {File f = new File("d:" + File.separator + "test");f.mkdir();// 建立檔案夾}}/** * 執行個體操作五:列出指定目錄的全部檔案 * 如果現在給出了一個目錄,則可以直接列出目錄中的內容。但是列出的方法在File類中存在兩個: * 以字串數組的形式返回:public String[] list() * 以File數組的形式返回:public File[] listFiles() *//*** 執行個體操作五:列出指定目錄的全部檔案 * 操作一:使用list()列出全部內容 * 該方法列出了D盤下的檔案夾和檔案的名字 */import java.io.File;public class FileOperate {public static void main(String[] args) {File f = new File("d:" + File.separator);String[] str = f.list();for (String s : str) {System.out.println(s);}}}/** * 執行個體操作五:列出指定目錄的全部檔案 * 操作二:使用listFiles()列出 * 列出了完全路徑 */import java.io.File;public class FileOperate {public static void main(String[] args) {File f = new File("d:" + File.separator);File[] files = f.listFiles();for (File file : files) {System.out.println(file);}}}/** * 執行個體操作六:判斷一個給定的路徑是否目錄 * 給定路徑,判斷是否是目錄 */import java.io.File;public class FileOperate {public static void main(String[] args) {File f = new File("d:" + File.separator);if (f.isDirectory()) {System.out.println(f.getPath() + "是目錄");} else {System.out.println(f.getPath() + "不是目錄");}}}/** * 執行個體操作七:列出指定目錄的全部內容(遞迴) * 如果給定了一個目錄,則要求把此目錄中的全部檔案都列出來,包括子檔案夾下的檔案 */import java.io.File;public class FileOperate {public static void main(String[] args) {File f = new File("d:" + File.separator);print(f);}public static void print(File f) {if (f != null) {if (f.isDirectory()) {File[] files = f.listFiles();if (files != null) {for (File file : files) {print(file);}}} else {System.out.println(f);}}}}/** * 執行個體操作八:列出磁碟下的路徑名 * @param public static File[] listRoots() * @return 該方法返回指示可用的檔案系統的根檔案對象的數組。如果不能確定該組的根該方法返回null。 */import java.io.File;public class FileDemo {public static void main(String[] args) {File[] paths;try {// returns pathnames for files and directorypaths = File.listRoots();// for each pathname in pathname arrayfor (File path : paths) {// prints file and directory pathsSystem.out.println(path);}} catch (Exception e) {// if any error occurse.printStackTrace();}}}/** * 執行個體操作九:列出磁碟下的檔案和檔案夾 * @param public static File[] listRoots() * @return 該方法返回指示可用的檔案系統的根檔案對象的數組。如果不能確定該組的根該方法返回null。 */import java.io.File;public class FileDemo {public static void main(String[] args) {File[] files = File.listRoots();for (File file : files) {System.out.println(file);if (file.length() > 0) {String[] filenames = file.list();for (String filename : filenames) {System.out.println(filename);}}}}}/** * 執行個體操作十:檔案過濾 * @param FilenameFilter類 * @return */import java.io.File;import java.io.FilenameFilter;import java.io.IOException;public class FileDemo {public static void main(String[] args) throws IOException {File dir = new File("d:\\daxiang\\testjava");File[] files = dir.listFiles(new FilenameFilter() {// 擷取.java檔案時使用listFiles(FilenameFilter filter)方法,建立一個過濾檔案名稱的Filterpublic boolean accept(File dir, String name) {if (name != null && "".equals("")) {// 檢測檔案名稱是否是以.saz結尾,是返回true,否則繼續檢測下一個檔案if (name.toLowerCase().endsWith(".java")) {return true;}}return false;}});for (File file : files) {System.out.println(file);}}}</span>
四、file.getPath()getAbsolutePath() getCanonicalPath()區別
可以參考的文章:File類的getPath、getAbsolutePath和getCanonicalPath的不同
import java.io.File;import java.io.IOException;public class getFilePath {public static void main(String[] args) throws IOException {System.out.println("------預設相對路徑,取得路徑不同-----");File f = new File("..\\src\\file");System.out.println(f.getPath());System.out.println(f.getAbsolutePath());System.out.println(f.getCanonicalPath());System.out.println("------預設相對路徑,取得路徑不同-----");File f2 = new File(".\\src\\file");System.out.println(f2.getPath());System.out.println(f2.getAbsolutePath());System.out.println(f2.getCanonicalPath());System.out.println("------預設絕對路徑,取得路徑相同-----");File f3 = new File("C:\\src\\file");System.out.println(f3.getPath());System.out.println(f3.getAbsolutePath());System.out.println(f3.getCanonicalPath());// 執行結果為:// ------預設相對路徑,取得路徑不同-----// ..\src\file// C:\workspace\Tip\..\src\file// C:\workspace\src\file// ------預設相對路徑,取得路徑不同-----// .\src\file// C:\workspace\Tip\.\src\file// C:\workspace\Tip\src\file// ------預設絕對路徑,取得路徑相同-----// C:\src\file// C:\src\file// C:\src\file//// 比較可以得到// getPath()返回的是構造方法裡的路徑,不做任何處理// getAbsolutePath()返回的是 user.dir+getPath(),也就是執行路徑加上構造方法中的路徑// getCanonicalPath()返回的是將符號完全解析的路徑,也就是全路徑}}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。