**
Java进阶学习(二)之File类的使用方法
**
(2020.2.22)
第一部分:File类的基本使用方法
1.File类获取功能的方法
pulic String getAbsoluth():返回File的绝对路径名称字符串
public String getPath():将此File转化为路径名称字符串
public String getName():返回由此File表示的文件或者目录的名称
public long getLength():返回由此File表示的文件的长度****
import java.io.File;
public class Demo02_File {
public static void main(String[] args) {
show01();
show02();
show03();
show04();
}
/*
public long getLength():返回由此File表示的文件的长度
获取的是构造方法指定的文件大小,以字节为单位
注意:
文件夹是没有大小概念的,不能获取文件夹的大小
如果构造方法中给出的路径不存在,那么length():方法返回0;
*/
private static void show04() {
File f1 = new File("C:\\Users\\大大白\\Desktop\\1.html");
long length = f1.length();
System.out.println(length);//5042
File f2 = new File("C:\\Users\\大大白\\Desktop\\2.html");
System.out.println(f2.length());//0
File f3 = new File("C:\\Users\\大大白\\Desktop\\3.html");
System.out.println(f3.length());//0
}
/*
public String getAbsolutePath():返回File的绝对路径名称字符串
获取构造方法中传递的路径
无论路径是绝对的还是相对的,getAbsolutePath()方法返回的都是绝对路径
*/
public static void show01(){
File f1 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File\\123.txt");
String absoluthPath1 = f1.getAbsolutePath();
System.out.println(absoluthPath1);
File f2 = new File("123.txt");
String absoluthPath2 = f2.getAbsolutePath();
System.out.println(absoluthPath2);
}
/*
public String getPath():将此File转化为路径名称字符串
获取构造方法中传递的路径
toString()方法就是调用的getPath()方法
*/
public static void show02(){
File f1 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File\\123.txt");
File f2 = new File("123.txt");
String path1 = f1.getPath();
System.out.println(path1);//C:\Users\大大白\IdeaProjects\Day01_File\123.txt
String path2 = f2.getPath();
System.out.println(path2);//123.txt
System.out.println(f1);//C:\Users\大大白\IdeaProjects\Day01_File\123.txt
System.out.println(f1.toString());//C:\Users\大大白\IdeaProjects\Day01_File\123.txt
}
/*
public String getName():返回由此File表示的文件或者目录的名称
获取的就是构造方法传递路径的结尾部分(文件/文件夹)
*/
public static void show03(){
File f1 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File\\123.txt");
String name1 = f1.getName();
System.out.println(name1);
File f2 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File");
String name2 = f2.getName();
System.out.println(name2);
}
}
2.文件/文件夹存在判断
public boolean exist():此File表示的文件或目录是否实际存在
public boolean isDirectory():此File表示的是否为目录
public boolean isFile():此File表示是否为文件
import java.io.File;
public class Demo03_File {
public static void main(String[] args) {
show01();
show02();
show03();
}
/*
public boolean isFile():此File表示是否为文件
*/
private static void show03() {
File f1 = new File("C:\\Users\\大大白\\Desktop\\1.html");
File f2 = new File("C:\\Users\\大大白\\Desktop");
boolean file1 = f1.isFile();
boolean file2 = f2.isFile();
System.out.println(file1);
System.out.println(file2);
}
/*
public boolean isDirectory():此File表示的是否为目录
*/
private static void show02() {
File f1 = new File("C:\\Users\\大大白\\Desktop\\1.html");
File f2 = new File("C:\\Users\\大大白\\Desktop");
boolean directory1 = f1.isDirectory();
boolean directory2 = f2.isDirectory();
System.out.println(directory1);
System.out.println(directory2);
}
/*
public boolean exist():此File表示的文件或目录是否实际存在
*/
private static void show01() {
File f1 = new File("C:\\Users\\大大白\\Desktop\\1.html");
File f2 = new File("C:\\Users\\大大白\\Desktop");
boolean exists1 = f1.exists();
System.out.println(exists1);
boolean exists2 = f2.exists();
System.out.println(exists2);
}
}
3.文件/文件夹创建和删除
public boolean createNewFile():当且仅当具有该名称的文件尚不存在时创建一个新的文件。
public boolean delete():删除由此File表示的文件和目录
public boolean mkdir():创建由此File表示的目录
public boolean mkdirs():创建由此File表示的目录,包括任何必须但不存在的父目录
import java.io.File;
import java.io.IOException;
public class FileCreateDelete {
public static void main(String[] args) throws IOException {
show01();
show02();
show03();
}
/*
public boolean delete():删除由此File表示的文件和目录
注意:delete方法是直接在硬盘删除文件//文件夹,不走回收站,删除要谨慎。
*/
private static void show03() {
File f1 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File\\Day01_File\\新建文件夹");
System.out.println(f1.delete());
File f2 = new File("Day01_File\\3.txt");
System.out.println(f2.delete());
}
/*
public boolean mkdir():创建由此File表示的目录,创建单级文件夹
public boolean mkdirs():创建由此File表示的目录,包括任何必须但不存在的父目录,创建多级文件夹。
*/
private static void show02() {
File f1 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File\\111");
boolean mkdir = f1.mkdir();
System.out.println(mkdir);
File f2 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File\\111\\222\\333\\444");
System.out.println(f2.mkdirs());
File f3 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File\\111\\222\\333\\444\\555\\1236.txt");
System.out.println(f3.mkdirs());
}
/*
public boolean createNewFile():当且仅当具有该名称的文件尚不存在时创建一个新的文件。
public boolean createNewFile() throws IOException
createNewFile声明抛出了IOException,我们调用这个方法,就必须处理这个异常,或者抛出异常。
注意:
1.此方法只能创建文件不能创建文件夹
2.创建文件的路径必须存在,否则会抛出异常
*/
private static void show01() throws IOException {
File f1 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File\\2.txt");
boolean file = f1.createNewFile();
System.out.println(file);
File f2 = new File("Day01_File\\3.txt");
System.out.println(f2.createNewFile());
File f3 = new File("Day01_File\\新建文件夹");//仍然时文件。
System.out.println(f3.createNewFile());
}
}
4.文件的遍历
public String list():返回一个String数组,表示该File目录中的所有子文件和目录
public File[] listFiles():返回一个File数组,表示该File目录中的所有子文件或目录
import java.io.File;
public class FileFor {
public static void main(String[] args) {
File dir = new File("D:\\APKDB");//目录不存在,则抛出空指针异常
//获取当前目录下的文件目录和文件名称
String[] names = dir.list();
for (String name : names) {
System.out.println(name);
}
//获取当前目录下的文件以及文件夹对象,只要拿到了文件对象,那么就可以获取更多信息
File[] files = dir.listFiles();
for (File file : files) {
System.out.println(file);
}
}
}
5.文件的递归遍历
public class Demo01_DiGui {
public static void main(String[] args) {
//a();
b(1);
}
/*
构造方法,禁止递归
编译报错:构造方法是创建对象使用的,一直递归会导致内存中有无数个对象,直接编译报错
*/
public Demo01_DiGui(){
// Demo01_DiGui();
}
private static void b(int i) {
System.out.println(i);
if(i==20000){
return;
}
b(++i);
}
/*
递归要有条件使程序停止,否则会出现栈内存溢出。
Exception in thread "main" java.lang.StackOverflowError
*/
private static void a() {
System.out.println("a方法");
a();
}
}
第二部分:递归以及文件的递归遍历
案例1:遍历打印文件多级目录
import java.io.File;
/*
递归打印多级目录
*/
public class DiGuiDemo3 {
public static void main(String[] args) {
File dir = new File("D:\\APKDB");
getAllFile(dir);
System.out.println("递归打印多级目录:");
getAllFile2(dir);
}
private static void getAllFile(File dir) {
File[] files = dir.listFiles();
for (File file : files) {
System.out.println(file);
}
}
public static void getAllFile2(File dir){
File[] files = dir.listFiles();
for (File file : files) {
if(file.isDirectory()){
getAllFile2(file);
}else{
System.out.println(file);
}
}
}
}
案例2:文件搜素
分析:
1.目标搜索,无法判断多少级目录,所以使用递归,遍历所有目录。
2.遍历目录时,获取的子文件,通过文件名称,判断是否符合条件。
public class DiGuiDemo4 {
public static void main(String[] args) {
//创建File对象
File dir = new File("D:\\APKDB");
//调用打印方法
printDir(dir);
}
private static void printDir(File dir) {
File[] files = dir.listFiles();
for (File file : files) {
if(file.isDirectory()){
printDir(file);
}else {
// /*
// 只要.exe结尾的文件
// 1.把File对象file,转化为字符串对象
// */
// //String name = file.getName();
// //String path = file.getPath();
// String s = file.toString();
//
// //2.把字符串转化为小写
// s = s.toLowerCase();
//
// //3.调用String类中的方法endWith判断字符串是否以.exe结尾
// boolean b = s.endsWith(".exe");
//
// //4.打印
// if(b){
// System.out.println(file);
// }
if(file.toString().toLowerCase().endsWith(".exe")){
System.out.println(file);
}
}
}
}
}
第三部分:文件过滤器FileFilter和FileNameFilter
需求:打印多级目录
可以使用过滤器来实现这一功能
在File类中有2个和listFile重载的方法,方法的参数传递就是过滤器
listFiles() 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
File[] listFiles(FileFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
File[] listFiles(FilenameFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
java.io.FileFilter接口:抽象路径(File对象)名的过滤器。
boolean accept(File pathname)测试指定的抽象路径名是否应包含在路径名列表中。
参数
pathname - 要测试的抽象路径名
结果
true if and only if pathname should be included
java.io.Interface FilenameFilter
boolean accept(File dir,String name)测试指定文件是否应包含在文件列表中。
参数
dir - 找到该文件的目录。
name - 文件的名称。
结果
true当且仅当该名称应包含在文件列表中时; false否则。
注意:2个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤器的方法accept,在方法中自己定义过滤的规则
public class FileFilter_Demo {
public static void main(String[] args) {
//创建File对象
File dir = new File("D:\\APKDB");
//调用打印方法
printDir(dir);
}
private static void printDir(File dir) {
//File[] files = dir.listFiles(new FileFilterImpl());//传递过滤器对象listF
// File[] files = dir.listFiles(new FileFilter() {
// @Override
// public boolean accept(File pathname) {
// if(pathname.isDirectory()){
// return true;
// }
// return pathname.toString().toLowerCase().endsWith(".exe");
// }
// });
// File[] files = dir.listFiles(new FilenameFilter() {
// @Override
// public boolean accept(File dir, String name) {
// return new File(dir,name).isDirectory()||name.toLowerCase().endsWith(".exe");
// }
// });
// //使用Lambda表达式优化匿名内部类(接口中只有一个抽象方法)
// File[] files = dir.listFiles((File d,String name)->{
// return new File(d,name).isDirectory()||name.toLowerCase().endsWith(".exe");
// });
//使用Lambda表达式优化匿名内部类(接口中只有一个抽象方法)
File[] files = dir.listFiles((d,name)-> new File(d,name).isDirectory()||name.toLowerCase().endsWith(".exe"));
/*
listFile一共做了3件事情
(1)listFiles方法会对构造方法中传递的目录进行遍历,获取目录中的每一个文件/文件夹-->封装为File对象
(2)listFiles方法调用参数传递的过滤器中的方法accept
(3)listFiles方法会把遍历得到的每一个File对象,传递过accept方法的参数pathname
*/
for (File file : files) {
if(file.isDirectory()){
printDir(file);
}else{
System.out.println(file);
}
}
}
}
重写过滤器FileFilter的实现类,重写过滤方法accept,定义过滤规则
/*
重写过滤器FileFilter的实现类,重写过滤方法accept,定义过滤规则
*/
public class FileFilterImpl implements FileFilter {
@Override
public boolean accept(File pathname) {
/*
判断file对象是否是以.exe结尾
*/
if(pathname.isDirectory()){
return true;
}
return pathname.toString().toLowerCase().endsWith(".exe");
}
}