File类
java.io.File
IO技术概述:
- a: Output
- 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作(即从程序到文件,对程序来说是输出操作)。
- b: Input
- 把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作(即从文件到程序,对程序来说是输入操作)。
- c: IO操作
- 把上面的这种输入和输出动作称为IO操作。
IO流是用来传输数据的。到底是输入还是输出,都是以Java程序为参照。
- 把上面的这种输入和输出动作称为IO操作。
File类概述和作用:
将操作系统中的文件、目录(文件夹)、路径,封装成File对象。
提供方法,操作系统中的内容。
File是与系统无关的类,“/”UNIX、LINUX平台,“\\”windows平台。
File类静态成员变量:pathSeparator,separator
public class FileDemo {
public static void main(String[] args) {
//File类静态成员变量
//与系统有关的路径分隔符(final常量,但因操作系统而改变)
String separator = File.pathSeparator;
System.out.println(separator);// 是一个分号;目录的分割
// (window中环境变量配置各个路径用分号分割,
// 表示一个完整的路径结束) Linux中是冒号 :
//与系统有关的默认名称分隔符
separator = File.separator;
System.out.println(separator);//目录名称分割
// window中:右划线 \ Linux中:左划线 /
}
}
File类构造函数(4种):
(1)File(File parent,String child)
parent:父抽象路径名 child:子路径名字符串
//将parent封装成file对象。
File dir = new File("e:\\java_code\\day22e");
File f3 = new File(dir,"hello.java");
异常:NullPointerException 如果child为null
(2)File(String pathname)
pathname:路径名字符串
String pathName = "e:\\java_code\\day22e\\hello.java";
File f1 = new File(pathName);
异常:NullPointerException 如果pathname为null
(3)File(String parent,String child)
parent:父路径名字符串 child:子路径名字符串
File f2 = new File("e:\\java_code\\day22e","hello.java");
异常:NullPointerException 如果child为null
(4)File(URI uri)
通过将给定的file: URI转换为抽象路径名来创建新的File实例
File uri = new File(" D:/java/Demo.txt ");
File file = new File(uri.toURI());
异常:NullPointerException 如果 uri是 null
IllegalArgumentException 如果参数的前提条件不成立
File类的获取(部分):
String | getAbsolutePath() 返回绝对路径名字符串 |
---|---|
File | getAbsoluteFile() 同上,返回值不同,eclipse环境中,写的是一个相对路径,返 回绝对位置工程根目录 |
String | getPath() 返回路径名字符串,等同于toString方法 |
long | length() 返回文件的长度 |
String | getParent() 返回父目录的路径名字符串 |
File | getParentFile() 返回父目录,当已无父目录时,返回null |
File类的判断功能:
boolean | exists() 判断File构造方法中封装路径是否存在 |
---|---|
boolean | isDirectory() 判断File构造方法中封装的路径是不是文件夹 |
boolean | isFile() 判断File构造方法中封装的路径是不是文件 |
!要判断是否为文件夹或文件,先判断是否存在!
File类的创建和删除功能:
(1)boolean createNewFile()
/**
*File创建文件的功能
*创建的文件的路径和名称,在File的构造方法中给出
*若文件已经存在,不再创建,返回flase
*该方法只能创建文件,不能创建文件夹
*/
public static void function() throws IOException{
File file = new File("C:\\a.txt");
boolean b = file.createNewFile();
System.out.println(b);
}
(2)boolean delete()
/**
*File类 删除文件或目录的功能
*删除的文件或目录,在File构造方法中给出
*文件打开状态时,删除失败
*删除方法不走回收站,直接从硬盘删除
*删除有风险,运行需谨慎
*/
public static void function() throws IOException{
File file = new File("C:\\a.txt");
boolean b = file.delete();
System.out.println(b);
}
(3)boolean mkdir(),boolean mkdirs()
/**
*File类 创建文件夹的功能
*mkdirs创建多层文件夹,mkdir创建单层文件夹
*创建的路径也在构造方法中给出
*若文件夹已经存在,不再创建
*/
public static void function() throws IOException{
File file = new File("C:\\abc");
boolean b = file.mkdir();
System.out.println(b); // b 为 true
File file_1 = new File("C:\\abc\\ab\\a");
boolean b = file.mkdirs();
}
File类的list获取功能:
(1)String[] list()
获取路径中的文件和文件夹名(相当于遍历一个目录),返回的只有名字
(2)File[] listFile()
获取路径中的文件和文件夹名(相当于遍历一个目录),返回文件或文件夹的全路径
public static void function(){
File file = new File("C:"); // 隐藏受保护的文件和文件夹也会打印出来
File fileArr = file.listFile();
for(File f : fileArr){
System.out.println(f);
}
}
文件过滤器:
作用:过滤一个目录下的指定扩展名的文件,或者包含某些关键字的文件夹
方法:
- public String[] list(FilenameFilter filter)
- public File[] listFiles(FileFilter filter) 传入实现了FileFilter接口的类对象
FileFilter接口,需重写的抽象方法:boolean accept(File pathname)
FilenameFilter接口,需要重写的方法:boolean accept(File dir,String name)
(dir:父目录路径,name:文件或文件夹名称)
/*
* 自定义过滤器
* 实现FileFilter接口,重写抽象方法
*/
public class MyFilter implements FileFilter{
public boolean accept(File pathname) {
/*
* pathname 接受到的也是文件的全路径
* c:\\demo\\1.txt
* 对路径进行判断,如果是java文件,返回true,不是java文件,返回false
* 文件的后缀结尾是.java
*/
return pathname.getName().endsWith(".java");
}
}
/*
* File类的获取,文件获取过滤器
* 遍历目录的时候,可以根据需要,只获取满足条件的文件
* 遍历目录方法 listFiles()重载形式
* listFiles(FileFilter filter)接口类型
* 传递FileFilter接口的实现类
* 自定义FileFilter接口实现类,重写抽象方法,
* 接口实现类对象传递到遍历方法listFiles
*/
public class FileDemo1 {
public static void main(String[] args) {
File file = new File("c:\\demo");
File[] fileArr = file.listFiles(new MyFilter());
for(File f : fileArr){
System.out.println(f);
}
}
}
文件过滤器实现原理递归遍历全目录
直接递归:方法自己调用自己,适用于,方法中运算的主体不变,但是运行的时候,参与运算的方法参数会变化。
要求:对一个目录的下的所有内容,进行完全的遍历,若指定的目录有子目录,那么把子目录中的文件路径也打印出来
步骤:
- 指定要打印的目录File对象
- 调用getFileAll()方法
2.1 获取指定目录中的所有File对象
2.2 遍历得到每一个File对象
2.3 判断当前File 对象是否是目录
判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法
判断结果为false,说明是文件,打印文件的路径
public class FileDemo2 {
public static void main(String[] args) {
File file = new File("d:\\test");
getFileAll(file);
}
//获取指定目录以及子目录中的所有的文件
public static void getFileAll(File file) {
File[] files = file.listFiles();
//遍历当前目录下的所有文件和文件夹
for (File f : files) {
//判断当前遍历到的是否为目录
if(f.isDirectory()){
//是目录,继续获取这个目录下的所有文件和文件夹
getFileAll(f);
}else{
//不是目录,说明当前f就是文件,那么就打印出来
System.out.println(f);
}
}
}
}
!!!递归一定要有出口, 必须可以让程序停下!递归次数不能过多!构造方法,禁止递归!
递归遍历出指定后缀名的文件:
public class MyJavaFilter implements FileFilter {
public boolean accept(File pathname) {
//判断获取的是目录,直接返回true
if(pathname.isDirectory())
return true;
return pathname.getName().toLowerCase().endsWith(".java");
}
}
/*
* 遍历目录,获取目录下的所有.java文件
* 遍历多级目录,方法递归实现
* 遍历的过程中,使用过滤器
*/
public class FileDemo1 {
public static void main(String[] args) {
getAllJava(new File("c:\\demo"));
// new File("c:\\demo").delete();
}
/*
* 定义方法,实现遍历指定目录
* 获取目录中所有的.java文件
*/
public static void getAllJava(File dir){
//调用File对象方法listFiles()获取,加入过滤器
File[] fileArr = dir.listFiles(new MyJavaFilter());
for(File f : fileArr){
//对f路径,判断是不是文件夹
if(f.isDirectory()){
//递归进入文件夹遍历
getAllJava(f);
}else{
System.out.println(f);
}
}
}
}