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") );