本文對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"及其子目錄和子文件。如下圖:
更多內容
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
10. java io系列09之 FileDescriptor總結