java.io.File類,文件和目錄路徑名的抽象表示形式。java
Java把電腦中的文件和目錄封裝成一個File類,讓咱們能夠經過File類進行文件操做。linux
關鍵詞:file、directory、path數組
絕對路徑:是一個完整的路徑ide
相對路徑:是一個簡化的路徑函數
注意:優化
路徑是不分大小寫的this
window系統下,文件名分隔符用反斜槓\ ,與轉義符號衝突,須要用兩個反斜槓\\表示一個普通的反斜槓\
操作系統
如D:\\IdeaProjects\\IO操做\\test.txt
code
Modifier and Type | Field and Description |
---|---|
static String |
pathSeparator 與系統相關的路徑分隔符字符,爲方便起見,表示爲字符串。 |
static char |
pathSeparatorChar 與系統相關的路徑分隔符。 |
static String |
separator 與系統相關的默認名稱 - 分隔符字符,以方便的方式表示爲字符串。 |
static char |
separatorChar 與系統相關的默認名稱分隔符。 |
package file; import java.io.File; public class TestFile { public static void main(String[] args) { /* File 類的有關靜態變量 pathSeparator 路徑分割符,不如在裝jdk環境變量時,不一樣路徑用分號隔開 window用分號; linux用冒號: separator 文件名稱分割符 window用反斜槓\ linux用正斜杆/ */ // 原始的是char型 System.out.println(File.pathSeparatorChar); System.out.println(File.separatorChar); // ""+原始 獲得字符串型 System.out.println(File.pathSeparator); System.out.println(File.separator); } }
可知不一樣的操做系統路徑表示是不同的,將來的開發中,爲了兼容不一樣系統,應該先獲取separator再拼接路勁,不能把路徑寫死!component
Constructor and Description |
---|
File(File parent, String child) 從父抽象路徑名和子路徑名字符串建立新的 File 實例。 |
File(String pathname) 經過將給定的路徑名字符串轉換爲抽象路徑名來建立新的 File 實例。 |
File(String parent, String child) 從父路徑名字符串和子路徑名字符串建立新的 File 實例。 |
File(URI uri) 經過將給定的 file: URI轉換爲抽象路徑名來建立新的 File 實例。 |
參數pathname:字符串的路徑名稱
路徑能夠以文件結尾,也能夠是文件夾結尾
路徑能夠是相對路徑,也能夠是絕對路徑
路徑能夠是存在的,也能夠不存在!
建立File對象,只是把字符串路徑封裝成File對象,不考慮路徑的真假。
public boolean exists()
此File表示的文件或目錄是否存在。public boolean isDirectory()
此File表示的文件是否爲目錄。public boolean isFile()
此File表示的文件是否爲普通文件。public boolean createNewFile()
當且僅當具備該名稱的文件尚不存在時,建立一個File空文件
。public boolean delete()
刪除由此File表示的文件/目錄。public boolean mkdir()
建立由此File表示的目錄。(單級)public boolean mkdirs()
建立由此File表示的目錄,包括任何須需但不存在的父目錄。(可多級)public String getAbsolutePath()
返回此File的絕對路徑名字符串。public String getPath()
將此File轉換爲路徑名字符串。public String getName()
返回由此File表示的文件或目錄的名稱。public long length()
返回由此File表示的文件的長度。public String[] list()
返回一個String數組,表示該File目錄中的全部子文件/目錄public File[] listFiles()
返回一個File數組,表示該File目錄中的全部子文件/目錄的抽象Filepackage file; import java.io.File; /** * 經過遞歸打印多級目錄 */ public class DirectoryTraversal { public static void main(String[] args) { File file = new File("aaa"); getAllFile(file); } public static void getAllFile(File dir) { System.out.println(dir.getAbsolutePath()); File[] files = dir.listFiles(); for (File file : files) { if (file.isFile()) { System.out.println(file.getAbsolutePath()); } else { getAllFile(file); } } } } 文件
在目錄遍歷的基礎上篩選某些類型的文件
package file; import java.io.File; /** * 經過遞歸打印多級目錄 * 同時篩選.java文件 */ public class SearchFile { public static void main(String[] args) { File file = new File("D:\\IdeaProjects\\IO操做"); getAllFile(file); } public static void getAllFile(File dir) { File[] files = dir.listFiles(); for (File file : files) { if (file.isFile()) { // 只打印以 .java結尾的文件 String name = file.getName(); name = name.toLowerCase();// 不區分大小寫 if (name.endsWith(".java")) { System.out.println(file.getAbsolutePath()); } } else { getAllFile(file); } } } }
只須要打印以前進行一些判斷便可。
返回值 | 描述 |
---|---|
File[] |
listFiles(FileFilter filter) 返回一個抽象路徑名數組,表示由此抽象路徑名錶示的知足指定過濾器的目錄中的文件和目錄。 |
File[] |
listFiles(FilenameFilter filter) 返回一個抽象路徑名數組,表示由此抽象路徑名錶示的知足指定過濾器的目錄中的文件和目錄。 |
查看官方文檔,FileFilter是一個接口,只定義了一個accept抽象方法,沒有實現類!!須要本身編寫實現類
過濾器實現類
package file; import java.io.File; import java.io.FileFilter; public class FileFilterImpl implements FileFilter { // 過濾標識 private String str; public FileFilterImpl() { str = ".java"; } public FileFilterImpl(String str) { this.str = str; } @Override public boolean accept(File pathname) { /* 過濾以.java結尾的文件 注意!若是是目錄也須要返回,不然將沒法遞歸遍歷多級目錄 */ if (pathname.isDirectory()) { return true; } return pathname.getName().toLowerCase().endsWith(str); } }
優化後的文件搜索
package file; import java.io.File; public class SearchFile2 { public static void main(String[] args) { File file = new File("D:\\IdeaProjects\\IO操做"); getAllFile(file); } public static void getAllFile(File dir) { // 經過過濾器篩選 .class結尾的文件 File[] files = dir.listFiles(new FileFilterImpl(".class")); for (File file : files) { if (file.isFile()) { System.out.println(file.getAbsolutePath()); } else { getAllFile(file); } } } }
解釋
File[] files = dir.listFiles(new FileFilterImpl(".class"));
package file; import java.io.File; import java.io.FileFilter; /** * 使用匿名內部類實現過濾器 */ public class SearchFile3 { public static void main(String[] args) { File file = new File("D:\\IdeaProjects\\IO操做"); getAllFile(file); } public static void getAllFile(File dir) { // 經過過濾器篩選 .java結尾的文件 File[] files = dir.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java"); } }); for (File file : files) { if (file.isFile()) { System.out.println(file.getAbsolutePath()); } else { getAllFile(file); } } } }
package file; import java.io.File; import java.io.FileFilter; /** * 使用lambda表達式函數式接口 */ public class SearchFile4 { public static void main(String[] args) { File file = new File("D:\\IdeaProjects\\IO操做"); getAllFile(file); } public static void getAllFile(File dir) { // 經過過濾器篩選 .java結尾的文件 File[] files = dir.listFiles((File pathname)->{ return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java"); }); for (File file : files) { if (file.isFile()) { System.out.println(file.getAbsolutePath()); } else { getAllFile(file); } } } }
FilenameFilter也和FlieFilter差很少
注意一下參數的類型便可,dir是根目錄,name是文件名
package java.io; /** * Instances of classes that implement this interface are used to * filter filenames. These instances are used to filter directory * listings in the <code>list</code> method of class * <code>File</code>, and by the Abstract Window Toolkit's file * dialog component. * * @author Arthur van Hoff * @author Jonathan Payne * @see java.awt.FileDialog#setFilenameFilter(java.io.FilenameFilter) * @see java.io.File * @see java.io.File#list(java.io.FilenameFilter) * @since JDK1.0 */ @FunctionalInterface public interface FilenameFilter { /** * Tests if a specified file should be included in a file list. * * @param dir the directory in which the file was found. * @param name the name of the file. * @return <code>true</code> if and only if the name should be * included in the file list; <code>false</code> otherwise. */ boolean accept(File dir, String name); }
lambda表示形式
package file; import java.io.File; /** * 使用lambda表達式函數式接口 */ public class SearchFile5 { public static void main(String[] args) { File file = new File("D:\\IdeaProjects\\IO操做"); getAllFile(file); } public static void getAllFile(File dir) { // 經過FilenameFilter過濾器篩選 .java結尾的文件 File[] files = dir.listFiles((File d, String name)->{ return new File(d,name).isDirectory() || name.toLowerCase().endsWith(".java"); }); for (File file : files) { if (file.isFile()) { System.out.println(file.getAbsolutePath()); } else { getAllFile(file); } } } }
File[] files = dir.listFiles( pathname->pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java") );