C語言中文網 目錄

Java File類(文件操作類)詳解

在操作文件之前必須創建一個指向文件的鏈接或者實例化一個文件對象,也可以指定一個不存在的文件從而創建它。

Java 中的 File 類是文件和目錄路徑名的抽象形式。使用 File 類可以獲取文件本身的一些信息,例如文件所在的目錄、文件長度、文件讀寫權限等。本節將對 File 類進行詳細介紹。

File 類簡介

在 Java 中,File 類是 java.io 包中唯一代表磁盤文件本身的對象。File 類定義了一些與平臺無關的方法來操作文件,File類主要用來獲取或處理與磁盤文件相關的信息,像文件名、 文件路徑、訪問權限和修改日期等,還可以瀏覽子目錄層次結構。

File 類表示處理文件和文件系統的相關信息。也就是說,File 類不具有從文件讀取信息和向文件寫入信息的功能,它僅描述文件本身的屬性。

File類提供了如下三種形式構造方法。
  1. File(File parent,String child):根據 parent 抽象路徑名和 child 路徑名字符串創建一個新 File 實例。
  2. File(String pathname):通過將給定路徑名字符串轉換成抽象路徑名來創建一個新 File 實例。如果給定字符串是空字符串,則結果是空的抽象路徑名。
  3. File(String parent,String child):根據 parent 路徑名字符串和 child 路徑名字符串創建一個新 File 實例。

使用任意一個構造方法都可以創建一個 File 對象,然后調用其提供的方法對文件進行操作。在表 1 中列出了 File 類的常用方法及說明。
表1 File類的常用方法
方法名稱 說明
boolean canRead() 測試應用程序是否能從指定的文件中進行讀取
boolean canWrite() 測試應用程序是否能寫當前文件
boolean delete() 刪除當前對象指定的文件 .
boolean exists() 測試當前 File 是否存在
String getAbsolutePath() 返回由該對象表示的文件的絕對路徑名
String getName() 返回表示當前對象的文件名
String getParent() 返回當前 File 對象路徑名的父路徑名,如果此名沒有父路徑則為 null
boolean isAbsolute() 測試當前 File 對象表示的文件是否為一個絕對路徑名
boolean isDirectory() 測試當前 File 對象表示的文件是否為一個路徑
boolean isFile() 測試當前 File 對象表示的文件是否為一個“普通”文件
long lastModified() 返回當前 File 對象表示的文件最后修改的時間
long length() 返回當前 File 對象表示的文件長度
String[] list() 返回當前 File 對象指定的路徑文件列表
String[] list(FilenameFilter) 返回當前 File 對象指定的目錄中滿足指定過濾器的文件列表
boolean mkdir() 創建一個目錄,它的路徑名由當前 File 對象指定
boolean mkdirs() 創建一個目錄,它的路徑名由當前 File 對象指定
boolean renameTo(File) 將當前 File 對象指定的文件更名為給定參數 File 指定的路徑名

注意:假設在 Windows 操作系統中有一文件 D:\javaspace\hello.java,在 Java 中使用的時候,其路徑的寫法應該為 D:/javaspace/hello.java 或者 D:\\javaspace\\hello.java

獲取文件屬性

在 Java 中獲取文件屬性信息的第一步是先創建一個 File 類對象并指向一個已存在的文件, 然后調用表 1 中的方法進行操作。

例 1

假設有一個文件位于 C:\windows\notepad.exe。編寫 Java 程序獲取并顯示該文件的長度、是否可寫、最后修改日期以及文件路徑等屬性信息。實現代碼如下:
package ch13;
import java.io.File;
import java.io.IOException;
import java.util.Date;
public class Test02
{
    public static void main(String[] args)
    {
         String path="C:/windows/";    //指定文件所在的目錄
         File f=new File(path,"notepad.exe");    //建立File變量,并設定由f變量引用
         System.out.println("C:\\windows\\notepad.exe文件信息如下:");
         System.out.println("============================================");
         System.out.println("文件長度:"+f.length()+"字節");
         System.out.println("文件或者目錄:"+(f.isFile()?"是文件":"不是文件"));
         System.out.println("文件或者目錄:"+(f.isDirectory()?"是目錄":"不是目錄"));
         System.out.println("是否可讀:"+(f.canRead()?"可讀取":"不可讀取"));
         System.out.println("是否可寫:"+(f.canWrite()?"可寫入":"不可寫入"));
         System.out.println("是否隱藏:"+(f.isHidden()?"是隱藏文件":"不是隱藏文件"));
         System.out.println("最后修改日期:"+new Date(f.lastModified()));
         System.out.println("文件名稱:"+f.getName());
         System.out.println("文件路徑:"+f.getPath());
         System.out.println("絕對路徑:"+f.getAbsolutePath());
    }
}

在上述代碼中 File 類構造方法的第一個參數指定文件所在位置,這里使用“C:/”作為文件的實際路徑;第二個參數指定文件名稱。創建的 File 類對象為 f,然后通過 f 調用方法獲取相應的屬性,最終運行效果如下所示。
C:\windows\notepad.exe文件信息如下:
============================================
文件長度:193536字節
文件或者目錄:是文件
文件或者目錄:不是目錄
是否可讀:可讀取
是否可寫:可寫入
是否隱藏:不是隱藏文件
最后修改日期:Mon Dec 28 02:55:19 CST 2015
文件名稱:notepad.exe
文件路徑:C:\windows\notepad.exe
絕對路徑:C:\windows\notepad.exe

創建和刪除文件

File 類不僅可以獲取已知文件的屬性信息,還可以在指定路徑創建文件,以及刪除一個文件。創建文件需要調用 createNewFile() 方法,刪除文件需要調用 delete() 方法。無論是創建還是刪除文件通常都先調用 exists() 方法判斷文件是否存在。

例 2

假設在 C:/Config 目錄下有一個 dbConfig.xml 文件是程序的配置文件,程序啟動時會檢測該文件是否存在,如果不存在則創建;如果存在則刪除它再創建。

實現代碼如下:
package ch13;
import java.io.File;
import java.io.IOException;
import java.util.Date;
public class Test03
{
    public static void main(String[] args) throws IOException
    {
          String path="C:/config/";    //指定文件目錄
          String filename="dbConfig.xml";    //指定文件名稱
          File f=new File(path,filename);    //創建指向文件的File對象
          if(f.exists())    //判斷文件是否存在
          {
              f.delete();    //存在則先刪除
           }
         f.createNewFile();    //再創建
    }
}

創建和刪除目錄

File 類除了對文件的創建和刪除外,還可以創建和刪除目錄。創建目錄需要調用 mkdir() 方法,刪除目錄需要調用 delete() 方法。無論是創建還是刪除目錄都可以調用 exists() 方法判斷目錄是否存在。

例 3

編寫一個程序判斷 C 盤根目錄下是否存在config目錄,如果存在則先刪除再創建。實現代碼如下:
package ch13;
import java.io.File;
import java.io.IOException;
import java.util.Date;
public class Test04
{
    public static void main(String[] args)
    {
          String path="C:/config/";    //指定目錄位置
          File f=new File(path);    //創建File對象
          if(f.exists())
          {
              f.delete();
          }
          f.mkdir();    //創建目錄
    }
}

遍歷目錄

通過遍歷目錄可以在指定的目錄中查找文件,或者顯示所有的文件列表。File 類的 list() 方法提供了遍歷目錄功能,該方法有如下兩種重載形式。

1. String[] list()

該方法表示返回由 File 對象表示目錄中所有文件和子目錄名稱組成的字符串數組,如果調用的 File 對象不是目錄,則返回 null。

提示:list() 方法返回的數組中僅包含文件名稱,而不包含路徑。但不保證所得數組中的相同字符串將以特定順序出現,特別是不保證它們按字母順序出現。

2. String[] list(FilenameFilter filter)

該方法的作用與 list() 方法相同,不同的是返回數組中僅包含符合 filter 過濾器的文件和目錄,如果 filter 為 null,則接受所有名稱。

例 4

假設要遍歷C盤根目錄下的所有文件和目錄,并顯示文件或目錄名稱、類型及大小。使用 list() 方法的實現代碼如下:
package ch13;
import java.io.File;
import java.io.IOException;
import java.util.Date;
public class Test05
{
    public static void main(String[] args)
    {
        File f=new File("C:/");    //建立File變量,并設定由f變量變數引用
        System.out.println("文件名稱\t\t文件類型\t\t文件大小");
        System.out.println("===================================================");
        String fileList[]=f.list();    //調用不帶參數的list()方法
        for (int i=0;i<fileList.length;i++)
        {    //遍歷返回的字符數組
            System.out.print(fileList[i]+"\t\t");
            System.out.print((new File("C:/",fileList[i])).isFile()?"文件"+ "\t\t":"文件夾"+"\t\t");
            System.out.println((new File("C:/",fileList[i])).length()+"字節");
        }
    }
}

由于 list() 方法返回的字符數組中僅包含文件名稱,因此為了獲取文件類型和大小,必須先轉換為 File 對象再調用其方法。如下所示的是實例的運行效果:
文件名稱        文件類型        文件大小
===================================================
$360Section        文件夾        12288字節
$Recycle.Bin        文件夾        0字節
360SANDBOX        文件夾        4096字節
adcfg.json        文件        61字節
AMD        文件夾        0字節
AppData        文件夾        0字節
Boot        文件夾        4096字節
bootmgr        文件        383786字節
Config.Msi        文件夾        786432字節
dlcache        文件夾        0字節
Documents and Settings        文件夾        0字節
Drivers        文件夾        4096字節
DTLService.exe        文件        143208字節
DTLSvcCore.dll        文件        85504字節
EFI        文件夾        0字節
Fireworks8-chs.exe        文件        92826464字節
Fireworks8-chs.zip        文件        92646389字節
grldr        文件        171136字節
InstallConfig.ini        文件        48字節
Intel        文件夾        0字節
KRECYCLE        文件夾        0字節
offline_FtnInfo.txt        文件        296字節
pagefile.sys        文件        8436592640字節
PerfLogs        文件夾        0字節
Program Files        文件夾        8192字節
Program Files (x86)        文件夾        12288字節
ProgramData        文件夾        8192字節
Readme-說明.htm        文件        3062字節
RECYCLER        文件夾        0字節
System Volume Information        文件夾        4096字節
syt        文件夾        0字節
temp        文件夾        4096字節
Users        文件夾        4096字節
Windows        文件夾        28672字節

例 5

假設希望只列出目錄下的某些文件,這就需要調用帶過濾器參數的 list() 方法。首先需要創建文件過濾器,該過濾器必須實現 java.io.FilenameFilter 接口,并在 accept() 方法中指定允許的文件類型。

如下所示為允許 SYS、TXT 和 BAK 格式文件的過濾器實現代碼:
import java.io.File;
import java.io.FilenameFilter;
public class ImageFilter implements FilenameFilter
{
    //實現 FilenameFilter 接口
    @Override
    public boolean accept(File dir,String name)
    {
        //指定允許的文件類型
        return name.endsWith(".sys")||name.endsWith(".txt")||name.endsWith(".bak");
    }
}

上述代碼創建的過濾器名稱為 ImageFilter,接下來只需要將該名稱傳遞給 list() 方法即可實現篩選文件。如下所示為修改后的 list() 方法,其他代碼與例 4 相同,這里不再重復。
String fileList[]=f.list(new ImageFilter());

再次運行程序,遍歷結果如下所示:
文件名稱        文件類型        文件大小
===================================================
offline_FtnInfo.txt        文件        296字節
pagefile.sys        文件        8436592640字節

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo