【Java IO流】File類的使用
File類的使用
Java中的File類是在java.io.File中,Java.IO.File類表示文件或目錄。
File類只用於表示文件(目錄)的信息(名稱、大小等),不能用於文件內容的訪問。
一、File類的常用API介紹
首先在我的d盤下創建一個測試用的文件夾和文本文件,如下圖所示:
1.創建File對象
我們創建一個File對象來獲取測試用的目錄,創建File對象最常用的就是通過文件的路徑來創建,即File(String 路徑),對於同一個路徑有 以下三種方式:
1 /* 2 * File(String 路徑) 3 */4 File file1=new File("D:\\code");//用雙斜杠進行轉義 5 File file2=new File("D:/code");//用反斜杠 6 File file3=new File("D:"+File.separator+"code");//File.separator File的靜態成員,設置分隔符
也可以通過File(父目錄,子目錄)來創建,如:
1 File file=new File("D:/code","new4");//通過父目錄來創建子目錄
等價於
File file=newFile("D:/code/new4");
2. exists() 判斷文件或目錄是否存在
在上述代碼下添加如下代碼,來看看這個目錄是否存在:
1 System.out.println(file1.exists()); 2 System.out.println(file2.exists()); 3 System.out.println(file3.exists());
運行結果:
3.mkdir()和mkdirs() 創建目錄或多級目錄
現在我想在剛剛那個目錄下再創建一個新的子目錄,這時就可以通過mkdir()方法,具體操作如下:
1 File file4=newFile("D:/code/new1"); 2 if(!file4.exists()){ 3 file4.mkdir();//也可以用mkdirs() 4 }
運行一下,查看一下剛剛的目錄,發現成功創建了一個新的目錄:
那麽我想創建多級目錄呢?可以通過mkdirs()方法來完成。
1 File file5=new File("D:/code/new2/new3");//創建多級目錄 2 if(!file5.exists()){ 3 file5.mkdirs();//註意這裏不能用mkdir(),只能用mkdirs() 4 }
運行之後,查看一下剛剛的目錄,發現成功創建了多級目錄:
4.isDirectory()和isFile() 判斷是否是目錄或者是否是文件
1 System.out.println("file5是否為目錄:"+file5.isDirectory()); 2 System.out.println("fil5是否為文件:"+file5.isFile()); 3 file5.delete();//刪除目錄 4 System.out.println("刪除file5後是否為目錄:"+file5.isDirectory()); 5 File file6=new File("D:/code/hysum.txt");//創建文件 6 System.out.println("file6是否為目錄:"+file6.isDirectory()); 7 System.out.println("file6是否為文件:"+file6.isFile()); 8 file6.delete();//刪除文件 9 System.out.println("刪除file6後是否為文件:"+file5.isFile());
運行結果:
結果分析:
isDirectory()和isFile()方法只有當此目錄或文件存在且類型匹配的情況下才返回true,不符合兩個條件的均返回false!
5.delete() 刪除文件或目錄
6.createNewFile() 創建新文件
在上面的例子裏我刪除掉了hysum.txt文件,這裏我要通過createNewFile()方法來創建該文件。
1 if(!file6.exists()){ 2 try { 3 file6.createNewFile(); 4 } catch (IOException e) { 5 // TODO Auto-generated catch block 6 e.printStackTrace(); 7 } 8 }
運行完畢之後,查看目錄,發現文件創建成功:
註意:createNewFile()會拋出IOException的異常,可以用try-catch語句捕獲或者拋出該異常!
上述的方法都是最簡單的,接下來我們看一下常用的File獲取get方法。
1.getAbsolutePath() 獲取絕對路徑。
2.getName() 獲取文件名稱,即當前目錄。
3.getParent() 獲取父級路徑(創建時的父路徑)。
4.getPath()獲取構造file時候的路徑。
我們來通過代碼看一下上述方法的使用效果;
1 File file=new File(".","new4");//.代表當前路徑,使用相對路徑來創建目錄 2 if(!file.exists()){ 3 file.mkdir(); 4 System.out.println("getName()獲取文件或目錄名稱:"+file.getName()); 5 System.out.println("getAbsolutePath()獲取絕對路徑:"+file.getAbsolutePath()); 6 System.out.println("getParent()獲取父級路徑:"+file.getParent()); 7 System.out.println("getPath()獲取文件目錄:"+file.getPath()); 8 9 }
運行結果:
註意:getParent() 獲取父級路徑是創建時的父路徑,而不是父路徑的絕對路徑,要獲取父路徑的絕對路徑可以通過file.getParent().getAbsolutePath()來獲取。
-----------------getPath()和getAbsolutePath()的不同點-----------------------------
getPath()得到的是構造file的時候的路徑。
getAbsolutePath()得到的是絕對路徑。如果構造的時候就是全路徑那直接返回全路徑;如果構造的時候時是相對路徑,返回當前目錄的路徑+構造file時候的路徑。
二、使用File類遍歷目錄
上面講述了File類的一些簡單的使用方法,這裏稍微復雜一點,我們要學習通過File類來遍歷目錄,對目錄進行一系列的操作。
這裏我新建了一個File類的工具類,名為FileUtils。這個類的功能是:列出File的一些常用操作比如過濾、遍歷等操作。把這些操作包裝成一個工具類,以後使用這個工具類對File對象進行這些操作就方便多了。
首先選一個測試目錄,就是剛剛那個d盤的code目錄,往裏面添加幾個文本文件。
---------------------------------FileUtils類方法----------------------------------------
---------------列出指定目錄下(包括其子目錄)的所有文件---------------
列出目錄下的文件方法有兩種:list()和listFiles(),這兩種方法有什麽區別呢?
先看第一種方法list(),它返回的是String類型的數組
1 public static void listDirectory(File dir) throws IOException{ 2 if(!dir.exists()){//目錄不存在,拋出異常 3 throw new IllegalArgumentException("該目錄不存在"); 4 } 5 if(!dir.isDirectory()){//不是一個目錄 6 throw new IllegalArgumentException("不是一個目錄"); 7 } 8 String[] filenames=dir.list();//list()方法返回一個String數組 9 for (String string : filenames) { 10 System.out.println(string); 11 } 12 13 }
主方法調用結果:
結果分析:可以看出list() 返回的是該目錄下直接所有子目錄和文件的名稱,但不包含子目錄下的內容。
那如何才能遍歷到子目錄下的文件呢?
如果要遍歷目錄下的內容就需要構造成File對象做遞歸操作,File提供了直接返回File對象的API,那就是listFiles()方法。
我把剛剛的方法修改後如下:
1 public class FileUtils { 2 /* 3 * 列出指定目錄下(包括其子目錄)的所有文件 4 */ 5 public static void listDirectory(File dir) throws IOException { 6 if (!dir.exists()) {// 目錄不存在,拋出異常 7 throw new IllegalArgumentException("該目錄不存在"); 8 } 9 if (!dir.isDirectory()) {// 不是一個目錄 10 throw new IllegalArgumentException("不是一個目錄"); 11 } 12 File[] files = dir.listFiles(); 13 if (files != null && files.length > 0) {// 判斷是否含有子目錄 14 for (File file : files) { 15 if (file.isDirectory()) {// 如果是子目錄,則做遞歸 16 listDirectory(file); 17 } else {// 如果是文件,則打印輸出 18 System.out.println(file); 19 } 20 21 } 22 } 23 24 }
運行結果:
可以看到成功遍歷了所有子目錄下的文件並輸出了。
-------------總結---------------
file.list() 返回的是 字符串數組 直接子目錄的名稱,不包含子目錄下的內容。
file.listFiles() 返回的是直接子目錄(文件)的對象。
這裏只列出了幾種常用的方法,更多File類的內容請自行查閱API哦~
File類只用於表示文件或目錄,不能用於文件內容的訪問;
而RandomAccessFile類提供的對文件內容的訪問,既可以讀文件,也可以寫文件。
下期預告《RandomAccessFile類的使用》
【Java IO流】File類的使用