File類描述的是一個文件或文件夾。(文件夾也可以稱為目錄)。該類的出現是對文件系統的中的文件以及文件夾進行對象的封裝。可以通過對象的思想來操作文件以及文件夾。可以用面向對象的處理問題,通過該對象的方法,可以得到文件或文件夾的信息方便了對文件與文件夾的屬性信息進行操作。文件包含很多的信息:如文件名、創建修改時間、大小、可讀可寫屬性等。
基本API
new File(String pathname);
通過將給定路徑來創建一個新File實例。
new File(String parent, String child);
根據parent路徑名字符串和child路徑名創建一個新File實例。parent是指上級目錄的路徑,完整的路徑為parent+child.
new File(File parent, String child);
根據parent抽象路徑名和child路徑名創建一個新File實例。 parent是指上級目錄的路徑,完整的路徑為parent.getPath()+child. 說明:如果指定的路徑不存在(沒有這個文件或是文件夾),不會拋異常,這時file.exists()返回false。
創建:
createNewFile() //在指定位置創建一個空文件,成功就返回true,如果已存在就不創建然后返回false mkdir() //在指定位置創建目錄,這只會創建最后一級目錄,如果上級目錄不存在就拋異常。 mkdirs() //在指定位置創建目錄,這會創建路徑中所有不存在的目錄。 renameTo(File dest) //重命名文件或文件夾,也可以操作非空的文件夾,文件不同時相當於文件的剪切,剪切時候不能操作非空的文件夾。移動/重命名成功則返回true,失敗則返回false。
刪除:
delete() //刪除文件或一個空文件夾,如果是文件夾且不為空,則不能刪除,成功返回true,失敗返回false。 deleteOnExit() //在虛擬機終止時,請求刪除此抽象路徑名表示的文件或目錄,保證程序異常時創建的臨時文件也可以被刪除
判斷:
exists() //文件或文件夾是否存在。 isFile() //是否是一個文件,如果不存在,則始終為false。 isDirectory() //是否是一個目錄,如果不存在,則始終為false。 isHidden() //是否是一個隱藏的文件或是否是隱藏的目錄。 isAbsolute() //測試此抽象路徑名是否為絕對路徑名。
獲取:
getName() //獲取文件或文件夾的名稱,不包含上級路徑。 getPath() //返回絕對路徑,可以是相對路徑,但是目錄要指定 getAbsolutePath() //獲取文件的絕對路徑,與文件是否存在沒關系 length() // 獲取文件的大小(字節數),如果文件不存在則返回0L,如果是文件夾也返回0L。 getParent() //返回此抽象路徑名父目錄的路徑名字符串;如果此路徑名沒有指定父目錄,則返回null。 lastModified() //獲取最后一次被修改的時間。 staic File[] listRoots() //列出所有的根目錄(Window中就是所有系統的盤符) list() //返回目錄下的文件或者目錄名,包含隱藏文件。對於文件這樣操作會返回null。 list(FilenameFilter filter) //返回指定當前目錄中符合過濾條件的子文件或子目錄。對於文件這樣操作會返回null。 listFiles() //返回目錄下的文件或者目錄對象(File類實例),包含隱藏文件。對於文件這樣操作會返回null。 listFiles(FilenameFilter filter) //返回指定當前目錄中符合過濾條件的子文件或子目錄。對於文件這樣操作會返回null。
路徑問題
對於UNIX平台,絕對路徑名的前綴是"/"。相對路徑名沒有前綴。
對於Windows平台,絕對路徑名的前綴由驅動器號和一個":"組成,例"c:\\..."。相對路徑沒有盤符前綴。
更專業的做法是使用File.separatorChar或者File.separator(前者為char,后者為String),這個值就會根據系統得到的相應的分割符。
常見File類的面試題目:
1、File類型中定義了什么方法來創建一級目錄
mkdirs() //在指定位置創建目錄,這會創建路徑中所有不存在的目錄。
2、File類型中定義了什么方法來判斷一個文件是否存在
exists() //文件或文件夾是否存在。
3、如何用Java代碼列出一個目錄下所有的文件?
//只查詢當前目錄 public class Main { public static void main(String[] args) { File f = new File("d:"); for(File temp : f.listFiles()) { if(temp.isFile()) { System.out.println(temp.getName()); } } } }
如果需要對文件夾繼續展開
public static void main(String[] args) { showDirectory(new File("d:\\file")); } public static void showDirectory(File f) { _walkDirectory(f, 0); } private static void _walkDirectory(File f, int level) { if(f.isDirectory()) { for(File temp : f.listFiles()) { _walkDirectory(temp, level + 1); } } else { for(int i = 0; i < level - 1; i++) { System.out.print("\t"); } System.out.println(f.getName()); } }
在Java 7中可以使用NIO.2的API來做同樣的事情,代碼如下所示:
public static void main(String[] args) throws IOException { Path initPath = Paths.get("/Users/Hao/Downloads"); Files.walkFileTree(initPath, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { System.out.println(file.getFileName().toString()); return FileVisitResult.CONTINUE; } }); }