1. 程式人生 > >【Java IO流】File類的使用

【Java IO流】File類的使用

parent static 技術 訪問 eat als 斜杠 rate 刪除

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=new
File("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=new
File("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類的使用