java io系列08之 File總結



本文對File的API和常用方法進行介紹。

轉載請注明出處:http://www.cnblogs.com/skywang12345/p/io_08.html

File 介紹

File 是“文件”和“目錄路徑名”的抽象表示形式。
File 直接繼承於Object,實現了Serializable接口和Comparable接口。實現Serializable接口,意味着File對象支持序列化操作。而實現Comparable接口,意味着File對象之間可以比較大小;File能直接被存儲在有序集合(如TreeSet、TreeMap中)。


File 函數列表

// 靜態成員
public static final String     pathSeparator        // 路徑分割符":"
public static final char     pathSeparatorChar    // 路徑分割符':'
public static final String     separator            // 分隔符"/"
public static final char     separatorChar        // 分隔符'/'

// 構造函數
File(File dir, String name)
File(String path)
File(String dirPath, String name)
File(URI uri)

// 成員函數
boolean    canExecute()    // 測試應用程序是否可以執行此抽象路徑名表示的文件。
boolean    canRead()       // 測試應用程序是否可以讀取此抽象路徑名表示的文件。
boolean    canWrite()      // 測試應用程序是否可以修改此抽象路徑名表示的文件。
int    compareTo(File pathname)    // 按字母順序比較兩個抽象路徑名。
boolean    createNewFile()         // 當且僅當不存在具有此抽象路徑名指定名稱的文件時,不可分地創建一個新的空文件。
static File    createTempFile(String prefix, String suffix)    // 在默認臨時文件目錄中創建一個空文件,使用給定前綴和后綴生成其名稱。
static File    createTempFile(String prefix, String suffix, File directory)    // 在指定目錄中創建一個新的空文件,使用給定的前綴和后綴字符串生成其名稱。
boolean    delete()             // 刪除此抽象路徑名表示的文件或目錄。
void    deleteOnExit()       // 在虛擬機終止時,請求刪除此抽象路徑名表示的文件或目錄。
boolean    equals(Object obj)   // 測試此抽象路徑名與給定對象是否相等。
boolean    exists()             // 測試此抽象路徑名表示的文件或目錄是否存在。
File    getAbsoluteFile()    // 返回此抽象路徑名的絕對路徑名形式。
String    getAbsolutePath()    // 返回此抽象路徑名的絕對路徑名字符串。
File    getCanonicalFile()   // 返回此抽象路徑名的規范形式。
String    getCanonicalPath()   // 返回此抽象路徑名的規范路徑名字符串。
long    getFreeSpace()       // 返回此抽象路徑名指定的分區中未分配的字節數。
String    getName()            // 返回由此抽象路徑名表示的文件或目錄的名稱。
String    getParent()          // 返回此抽象路徑名父目錄的路徑名字符串;如果此路徑名沒有指定父目錄,則返回 null。
File    getParentFile()      // 返回此抽象路徑名父目錄的抽象路徑名;如果此路徑名沒有指定父目錄,則返回 null。
String    getPath()            // 將此抽象路徑名轉換為一個路徑名字符串。
long    getTotalSpace()      // 返回此抽象路徑名指定的分區大小。
long    getUsableSpace()     // 返回此抽象路徑名指定的分區上可用於此虛擬機的字節數。
int    hashCode()               // 計算此抽象路徑名的哈希碼。
boolean    isAbsolute()         // 測試此抽象路徑名是否為絕對路徑名。
boolean    isDirectory()        // 測試此抽象路徑名表示的文件是否是一個目錄。
boolean    isFile()             // 測試此抽象路徑名表示的文件是否是一個標准文件。
boolean    isHidden()           // 測試此抽象路徑名指定的文件是否是一個隱藏文件。
long    lastModified()       // 返回此抽象路徑名表示的文件最后一次被修改的時間。
long    length()             // 返回由此抽象路徑名表示的文件的長度。
String[]    list()           // 返回一個字符串數組,這些字符串指定此抽象路徑名表示的目錄中的文件和目錄。
String[]    list(FilenameFilter filter)    // 返回一個字符串數組,這些字符串指定此抽象路徑名表示的目錄中滿足指定過濾器的文件和目錄。
File[]    listFiles()                        // 返回一個抽象路徑名數組,這些路徑名表示此抽象路徑名表示的目錄中的文件。
File[]    listFiles(FileFilter filter)       // 返回抽象路徑名數組,這些路徑名表示此抽象路徑名表示的目錄中滿足指定過濾器的文件和目錄。
File[]    listFiles(FilenameFilter filter)   // 返回抽象路徑名數組,這些路徑名表示此抽象路徑名表示的目錄中滿足指定過濾器的文件和目錄。
static File[]    listRoots()    // 列出可用的文件系統根。
boolean    mkdir()     // 創建此抽象路徑名指定的目錄。
boolean    mkdirs()    // 創建此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。
boolean    renameTo(File dest)    // 重新命名此抽象路徑名表示的文件。
boolean    setExecutable(boolean executable)    // 設置此抽象路徑名所有者執行權限的一個便捷方法。
boolean    setExecutable(boolean executable, boolean ownerOnly)    // 設置此抽象路徑名的所有者或所有用戶的執行權限。
boolean    setLastModified(long time)       // 設置此抽象路徑名指定的文件或目錄的最后一次修改時間。
boolean    setReadable(boolean readable)    // 設置此抽象路徑名所有者讀權限的一個便捷方法。
boolean    setReadable(boolean readable, boolean ownerOnly)    // 設置此抽象路徑名的所有者或所有用戶的讀權限。
boolean    setReadOnly()                    // 標記此抽象路徑名指定的文件或目錄,從而只能對其進行讀操作。
boolean    setWritable(boolean writable)    // 設置此抽象路徑名所有者寫權限的一個便捷方法。
boolean    setWritable(boolean writable, boolean ownerOnly)    // 設置此抽象路徑名的所有者或所有用戶的寫權限。
String    toString()    // 返回此抽象路徑名的路徑名字符串。
URI    toURI()    // 構造一個表示此抽象路徑名的 file: URI。
URL    toURL()    // 已過時。 此方法不會自動轉義 URL 中的非法字符。建議新的代碼使用以下方式將抽象路徑名轉換為 URL:首先通過 toURI 方法將其轉換為 URI,然后通過 URI.toURL 方法將 URI 裝換為 URL。

 

1. 新建目錄的常用方法

方法1:根據相對路徑新建目錄。

示例代碼如下(在當前路徑下新建目錄“dir”):

File dir = new File("dir");
dir.mkdir();

方法2:根據絕對路徑新建目錄。

示例代碼如下(新建目錄“/home/skywang/dir”):

File dir = new File("/home/skywang/dir");
dir.mkdirs();

說明:上面是在linux系統下新建目錄“/home/skywang/dir”的源碼。在windows下面,若要新建目錄“D:/dir”,源碼如下:

File dir = new File("D:/dir");
dir.mkdir();

方法3

URI uri = new URI("file:/home/skywang/dir"); 
File dir = new File(uri);
sub.mkdir();

說明: 和“方法2”類似,只不過“方法2”中傳入的是完整路徑,而“方法3”中傳入的是完整路徑對應URI。


2. 新建子目錄的幾種常用方法

例如,我們想要在當前目錄的子目錄“dir”下,再新建一個子目錄。有一下幾種方法:

方法1

File sub1 = new File("dir", "sub1");
sub1.mkdir();

說明:上面的方法作用是,在當前目錄下 "dir/sub1"。它能正常運行的前提是“sub1”的父目錄“dir”已經存在!

方法2

File sub2 = new File(dir, "sub2");
sub2.mkdir();

說明:上面的方法作用是,在當前目錄下 "dir/sub2"。它能正常運行的前提是“sub2”的父目錄“dir”已經存在!

方法3

File sub3 = new File("dir/sub3");
sub3.mkdirs();

說明:上面的方法作用是,在當前目錄下 "dir/sub3"。它不需要dir已經存在,也能正常運行;若“sub3”的父母路不存在,mkdirs()方法會自動創建父目錄。

方法4

File sub4 = new File("/home/skywang/dir/sub4");
sub4.mkdirs();

說明:上面的方法作用是,新建目錄"/home/skywang/dir/sub3"。它不需要dir已經存在,也能正常運行;若“sub4”的父母路不存在,mkdirs()方法會自動創建父目錄。

方法5

URI uri = new URI("file:/home/skywang/dir/sub5"); 
File sub5 = new File(uri);
sub5.mkdirs();

說明: 和“方法4”類似,只不過“方法4”中傳入的是完整路徑,而“方法5”中傳入的是完整路徑對應URI。

 

3. 新建文件的幾種常用方法

例如,我們想要在當前目錄的子目錄“dir”下,新建一個文件。有一下幾種方法

方法1

try {
    File dir = new File("dir");    // 獲取目錄“dir”對應的File對象
    File file1 = new File(dir, "file1.txt");
    file1.createNewFile();
} catch (IOException e) {
    e.printStackTrace();
}

說明:上面代碼作用是,在“dir”目錄(相對路徑)下新建文件“file1.txt”。

方法2

try {
    File file2 = new File("dir", "file2.txt");
    file2.createNewFile();
} catch (IOException e) {
    e.printStackTrace();
}

說明:上面代碼作用是,在“dir”目錄(相對路徑)下新建文件“file2.txt”。

方法3

try {
    File file3 = new File("/home/skywang/dir/file3.txt");
    file3.createNewFile();
} catch (IOException e) {
    e.printStackTrace();
}

說明:上面代碼作用是,下新建文件“/home/skywang/dir/file3.txt”(絕對路徑)。這是在linux下根據絕對路徑的方法,在windows下可以通過以下代碼新建文件"D:/dir/file4.txt"。

try {
    File file3 = new File("D:/dir/file4.txt");
    file3.createNewFile();
} catch (IOException e) {
    e.printStackTrace();
}

方法4

try {
    URI uri = new URI("file:/home/skywang/dir/file4.txt"); 
    File file4 = new File(uri);
    file4.createNewFile();
} catch (IOException e) {
    e.printStackTrace();
}

說明
和“方法3”類似,只不過“方法3”中傳入的是完整路徑,而“方法4”中傳入的是完整路徑對應URI。

File API使用示例

關於File中API的詳細用法,參考示例代碼(FileTest.java):

  1 import java.io.File;
  2 import java.io.IOException;
  3 import java.net.URI;
  4 import java.util.Calendar;
  5 import java.text.SimpleDateFormat;
  6 
  7 public class FileTest {
  8 
  9     public static void main(String[] args) {
 10         testFileStaticFields() ;
 11     testFileDirAPIS() ;
 12     }
 13 
 14     public static void testFileStaticFields() {
 15         // 打印 路徑分隔符":"
 16         System.out.printf("File.pathSeparator=\"%s\"\n", File.pathSeparator);
 17         // 打印 路徑分隔符':'
 18         System.out.printf("File.pathSeparatorChar=\"%c\"\n", File.pathSeparatorChar);
 19         // 打印 分隔符"/"
 20         System.out.printf("File.separator=\"%s\"\n", File.separator);
 21         // 打印 分隔符'/'
 22         System.out.printf("File.separatorChar=\"%c\"\n", File.separatorChar);
 23     }
 24 
 25     public static void testFileDirAPIS() {
 26         try {
 27         // 新建目錄 "dir"
 28         File dir = new File("dir");
 29         dir.mkdir();
 30 
 31         // 方法1:新建目錄 "dir/sub1"。父目錄“dir”必須已經存在!
 32         File sub1 = new File("dir", "sub1");
 33         sub1.mkdir();
 34         // 方法2:新建目錄 "dir/sub2"。父目錄“dir”必須已經存在!
 35         File sub2 = new File(dir, "sub2");
 36         sub2.mkdir();
 37         // 方法3:新建目錄 "dir/sub3"。mkdirs()會自動創建不存在的父目錄。
 38         File sub3 = new File("dir/sub3");
 39         sub3.mkdirs();
 40         // 方法4:新建目錄 "dir/sub4"。根據“絕對路徑”創建,前面3個方法都是根據“相對路徑”創建。
 41         String dirPath = dir.getAbsolutePath();    // 獲取“dir”的絕對路徑
 42         String sub4AbsPath = dirPath + File.separator + "sub4";    // File.separator是分隔符"/"
 43         File sub4 = new File(sub4AbsPath);
 44         sub4.mkdirs();
 45         // 方法5:新建目錄 "dir/sub5"。根據uri
 46         String uri_sub5_path = "file:"+ dirPath + File.separator + "sub5";
 47         URI uri_sub5 = new URI(uri_sub5_path); 
 48         File sub5 = new File(uri_sub5);
 49         sub5.mkdirs();
 50 
 51         // 方法1:新建文件 "dir/l1_normal.txt"
 52         File l1_normal = new File(dir, "l1_normal.txt");
 53         l1_normal.createNewFile();
 54         // 方法2:新建文件 "dir/.l1_hide.txt"。
 55         File l1_hide = new File("dir", ".l1_hide.txt"); // 在linux中, "."開頭的文件是隱藏文件。
 56         l1_hide.createNewFile();
 57         // 方法3:新建文件 "dir/l1_abs.txt"。
 58         String dirAbsPah =  dir.getAbsolutePath();    // 獲取dir的絕對路徑
 59         String l1_abs_path = dirAbsPah+File.separator+"l1_abs.txt";
 60         File l1_abs = new File(l1_abs_path);
 61         l1_abs.createNewFile();
 62         //System.out.printf("l1_abs_path=%s\n", l1_abs_path);
 63         //System.out.printf("l1_abs path=%s\n", l1_abs.getAbsolutePath());
 64         // 方法4:新建文件 "dir/l1_uri.txt"。根據URI新建文件
 65         String uri_path = "file:"+ dirAbsPah + File.separator + "l1_uri.txt";
 66         URI uri_l1 = new URI(uri_path); 
 67         //System.out.printf("uri_l1=%s\n", l1_abs.getAbsolutePath());
 68         File l1_uri = new File(uri_l1); 
 69         l1_uri.createNewFile();
 70 
 71         // 新建文件 "dir/sub/s1_normal"
 72         File s1_normal = new File(sub1, "s1_normal.txt");
 73         s1_normal.createNewFile();
 74 
 75         System.out.printf("%30s = %s\n", "s1_normal.exists()", s1_normal.exists());
 76         System.out.printf("%30s = %s\n", "s1_normal.getName()", s1_normal.getName());
 77         System.out.printf("%30s = %s\n", "s1_normal.getParent()", s1_normal.getParent());
 78         System.out.printf("%30s = %s\n", "s1_normal.getPath()", s1_normal.getPath());
 79         System.out.printf("%30s = %s\n", "s1_normal.getAbsolutePath()", s1_normal.getAbsolutePath());
 80         System.out.printf("%30s = %s\n", "s1_normal.getCanonicalPath()", s1_normal.getCanonicalPath());
 81         System.out.printf("%30s = %s is \"%s\"\n", "s1_normal.lastModified()", s1_normal.lastModified(), getModifyTime(s1_normal.lastModified()));
 82         System.out.printf("%30s = %s\n", "s1_normal.toURI()", s1_normal.toURI());
 83 
 84 
 85         // 列出“dir”目錄下的“文件”和“文件夾”。
 86         // 注意:dir.listFiles()只會遍歷目錄dir,而不會遍歷dir的子目錄!
 87         System.out.println("---- list files and folders ----");
 88         File[] fs = dir.listFiles();
 89         for (File f:fs) {
 90             String fname = f.getName();
 91             String absStr = f.isAbsolute() ? "[Absolute]" : "";
 92             String hidStr = f.isHidden() ? "[Hidden]" : "";
 93             String dirStr = f.isDirectory() ? "[Directory]" : "";
 94             String fileStr = f.isFile() ? "[File]" : "";
 95 
 96             System.out.printf("%-30s  %s%s%s%s\n", fname, fileStr, dirStr, absStr, hidStr);
 97         }
 98 
 99         } catch (Exception e) {
100             e.printStackTrace();
101         }
102     }
103 
104     private static String getModifyTime(long millis) {
105         // 獲取Calendar對象
106         Calendar cal = Calendar.getInstance();
107         // 設置時間為 millis
108         cal.setTimeInMillis(millis);
109         // 獲取格式化對象,它會按照"yyyy-MM-dd HH:mm:ss"格式化日期
110         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
111         //System.out.printf("TIME %s\n", str);
112         return sdf.format(cal.getTime()); 
113     }
114 
115 }

運行結果(在ubuntu 12.04系統下的運行結果,而不是windows!):

File.pathSeparator=":"
File.pathSeparatorChar=":"
File.separator="/"
File.separatorChar="/"
            s1_normal.exists() = true
           s1_normal.getName() = s1_normal.txt
         s1_normal.getParent() = dir/sub1
           s1_normal.getPath() = dir/sub1/s1_normal.txt
   s1_normal.getAbsolutePath() = /home/skywang/wind_talker/workout/java/skywang/io/io/src/file/dir/sub1/s1_normal.txt
  s1_normal.getCanonicalPath() = /home/skywang/wind_talker/workout/java/skywang/io/io/src/file/dir/sub1/s1_normal.txt
      s1_normal.lastModified() = 1381730064000 is "2013-10-14 13:54:24"
             s1_normal.toURI() = file:/home/skywang/wind_talker/workout/java/skywang/io/io/src/file/dir/sub1/s1_normal.txt
---- list files and folders ----
l1_uri.txt                      [File]
sub1                            [Directory]
l1_abs.txt                      [File]
sub5                            [Directory]
sub4                            [Directory]
.l1_hide.txt                    [File][Hidden]
sub3                            [Directory]
sub2                            [Directory]
l1_normal.txt                   [File]

結果說明:運行程序,會在源文件所在的目錄新建目錄"dir"及其子目錄和子文件。如下圖:


更多內容

01. java 集合系列目錄(Category)

02. java io系列01之 IO框架

03. java io系列02之 ByteArrayInputStream的簡介,源碼分析和示例(包括InputStream)

04. java io系列03之 ByteArrayOutputStream的簡介,源碼分析和示例(包括OutputStream)

05. java io系列04之 管道(PipedOutputStream和PipedInputStream)的簡介,源碼分析和示例

06. java io系列05之 ObjectInputStream 和 ObjectOutputStream

07. java io系列06之 序列化總結(Serializable 和 Externalizable)

08. java io系列07之 FileInputStream和FileOutputStream

09. java io系列08之 File總結

10. java io系列09之 FileDescriptor總結

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM