1 File
1.1 介绍
当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作。
当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作。
1.2 File类的三种构造函数
// File构造函数1 File( String pathname)
String pathName = "/Users/Mac/mydata/iotest.txt";
File f1 = new File(pathName);
System.out.println(f1);
// 构造函数2 File( String parent, String child)
File f2 = new File("/Users/Mac/mydata", "iotest.txt");
System.out.println(f2);
// 构造函数3 File( File parent, String child)
File dir = new File("/Users/Mac/mydata");
File f3 = new File(dir, "iotest.txt");
System.out.println(f3);
1.3 File 类的获取
// 创建文件对象
File file = new File("iodemo.txt");
// 1 获取文件的绝对路径,即全路径
String absPath = file.getAbsolutePath();
System.out.println(absPath); // /Users/Mac/Documents/workspace/eclipse_workspace/TestJava/iodemo.txt
// 2 File中封装的路径是什么获取到的就是什么。
String path = file.getPath();
System.out.println(path); // iodemo.txt
// 3 获取文件名称
String filename = file.getName();
System.out.println(filename); // iodemo.txt
// 4 获取文件大小
long size = file.length();
System.out.println(size);// 0
1.4 文件和文件夹的创建与删除
File file = new File("file.txt");
// 1 创建文件,如果文件不存在,创建并返回true;如果文件存在,则不创建并返回false。如果路径错误,IOException。
boolean b1 = file.createNewFile();
System.out.println("b1 create =" + b1);
// -----------删除文件操作-------注意:不去回收站。慎用------
boolean b2 = file.delete();
System.out.println("b2 delete =" + b2);
// -----------判断文件是否存在------------
boolean b3 = file.exists();
System.out.println("b3 exist =" + b3);
// -----------对目录操作 创建,删除,判断------------
File dir = new File("/Users/Mac/mydata/iotest");
// mkdir()创建单个目录。//dir.mkdirs();创建多级目录
boolean b4 = dir.mkdir();
System.out.println("b4 mkdir =" + b4);
// 删除目录时,如果目录中有内容,无法直接删除。
boolean b5 = dir.delete();
// 只有将目录中的内容都删除后,保证该目录为空。这时这个目录才可以删除。
System.out.println("b5 delete=" + b5);
// -----------判断文件,目录------------
File f = new File("/Users/Mac/mydata");// 要判断是否是文件还是目录,必须先判断存在。
if (f.exists()) {
System.out.println(f.isFile());
System.out.println(f.isDirectory());
}
// 结果:
b1 create =true
b2 delete =true
b3 exist =false
b4 mkdir =true
b5 delete=true
false
true
注意:
- 删除文件操作,将文件直接删除,文件不放入回收站。
- mkdir()创建单个目录,mkdirs() 创建多级目录。
- 删除目录时,如果目录中有内容,无法直接删除。
- 判断路径是目录还是文件时,先要判断它是否存在。
1.5 listFiles() 方法
示例:
File dir = new File("/Users/Mac/mydata");
// 1 获取的是目录下的当前的文件以及文件夹的名称。
String[] names = dir.list();
for (String name : names) {
System.out.println(name);
}
// 2 获取目录下当前文件以及文件对象,只要拿到了文件对象,那么就可以获取其中想要的信息
File[] files = dir.listFiles();
for (File file : files) {
System.out.println(file);
}
1.6 文件过滤器
1)FilenameFilter
// 自定类继承 FilenameFilter 过滤器接口
public class MyFileFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return name.endsWith(".txt");
}
}
// 测试类
public class TestSth {
public static void main(String[] args) throws IOException {
// 获取扩展名为.txt所有文件
// 1 创建File对象
File file = new File("/Users/Mac/mydata");
// 2 获取指定扩展名的文件,由于要对所有文件进行扩展名筛选,因此调用方法需要传递过滤器
File[] files = file.listFiles(new MyFileFilter());
// 3 遍历获取到的所有符合条件的文件
for (File f : files) {
System.out.println(f);
}
}
}
- FileFilter
// 自定义类继承FileFilter过滤器接口
public class FileFileterByDir implements FileFilter {
@Override
public boolean accept(File pathname) {
// TODO Auto-generated method stub
return pathname.isDirectory();
}
}
// 测试类
public class TestSth {
public static void main(String[] args) throws IOException {
// 获取扩展名为.java所有文件
// 1 创建File对象
File file = new File("/Users/Mac/mydata");
// 2 获取指定目录下的文件夹
File[] files = file.listFiles(new FileFileterByDir());
// 3 遍历获取到的所有符合条件的文件
for (File f : files) {
System.out.println(f);
}
}
}
3)总结
FilenameFilter过滤器中的accept方法接受两个参数,一个当前文件或文件夹所在的路径,一个是当前文件或文件夹对象的名称。
FileFilter 过滤器中的accept方法接受一个参数,这个参数就当前文件或文件夹对象。
当我们需要过滤文件名称时就可以使用FilenameFilter这个过滤器,当我们想对当前文件或文件夹进行过滤,就可以使用FileFilter ,比如需要当前目录下的所有文件夹,就可以使用FileFilter 过滤器。
2 递归
2.1 介绍
递归,指在当前方法内调用自己的这种现象。
递归分为两种,直接递归和间接递归:
- 直接递归为方法自身调用自己。
- 间接递归可以是A方法调用B方法,B方法调用C方法,C方法调用A方法。
示例:计算累加和
public static int getSum(int n) {
if (n == 1) {
return 1;
}
return n + getSum(n - 1);
}
public static void main(String[] args) {
// 计算1~num的和,使用递归完成
int n = 5;
int sum = getSum(n);
System.out.println(sum);
}
注意:递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
2.2 递归打印所有子目录中的文件路径
// 获取指定目录以及子目录中的所有的文件
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 static void main(String[] args) {
File file = new File("/Users/Mac/mydata");
getFileAll(file);
}
2.3 搜索目录中的指定文件(含子目录)
// 将上面代码中listFiles()方法中加入过滤器
File[] files = file.listFiles(new MyFileFilter());