File是个文件类,可以用其增加、删除、查找某种类型的文件或者文件夹,同时根据其成员变量的特点可以综合利用,避免出现跨系统的时候出现错误,并且查找时最好输入绝对路径,以免出现不存在的文件。使用递归时一定要主要好停止,以免栈内存溢出。
一、简述IO操作:
当需要把内存中的数据存储到持久化设备上的这个动作称为输出(写)output操作;
当把持久设备上的数据读取到内存中的这个动作称为输入(读)input操作。
这个输入和输出的动作称为IO操作。
二、File类:
1、文件类:
成员变量:
import java.io.File;
public class Demo01 {
public static void main(String[] args) {
//File类
//文件:File
//目录(文件夹):directory
//路径:path
//路径分隔符(与系统有关的)
System.out.println(File.pathSeparator); // ;
//与系统有关的路径名称分隔符
System.out.println(File.separator); // \
}
}
2、构造函数:
import java.io.File;
public class Demo02 {
public static void main(String[] args) {
File file=new File("D:\\java\\b.txt"); //双\\是转义
System.out.println(file);
File file2=new File("D:\\java","a.txt");//父路径、子路径--可以适用于多个文件的!
System.out.println(file2);
File parent=new File("D:\\java");
File file3=new File(parent,"a.txt");//File类的父路径、子路径
System.out.println(file3);
}
}
3、File类的获取及文件的创建和删除、判断:
import java.io.File;
import java.io.IOException;
public class Demo03 {
public static void main(String[] args) throws IOException {
method06();
}
public static void method01(){
File file=new File("D:\\java\\a.txt");
//获取文件对象的绝对路径
System.out.println(file.getAbsolutePath());
File file0=new File("src");//写相对路径的话,会自动转成绝对路径,但是不去检验文件是否真实存在(只会给翻译回来,可能根本不存在) D:\JAVA0322\Day16\src
//获取文件对象的绝对路径
System.out.println(file0.getAbsolutePath());
File file00=new File("aa");//这个根本不存在 D:\JAVA0322\Day16\aa
//获取文件对象的绝对路径
System.out.println(file00.getAbsolutePath());
//获取文件对象的文件名或者目录名
System.out.println(file.getName());
//获取文件对象的路径所对应的字符串 类似于toString()方法
System.out.println(file.getPath());
//获取文件的大小(字节---Long类型)
System.out.println(file.length());
}
//文件创建和删除
public static void method02() throws IOException{
File file=new File("D:\\java\\d");
//创建文件
boolean flag=file.createNewFile();//都是创建的文件(最好都是加上后缀的),不能是文件夹
System.out.println(flag);
}
//文件删除
public static void method03(){
File file=new File("D:\\java\\d");
//删除文件(找不回来了)
boolean flag=file.delete();
System.out.println(flag);
}
//文件判断
public static void method04(){
File file=new File("D:\\java\\a.txt");
//判断该文件对象所对应的文件是否存在
System.out.println(file.exists());
//判断该文件对象是否是文件夹
System.out.println(file.isDirectory());
//判断该文件对象是否是文件
System.out.println(file.isFile());
}
//创建文件夹
public static void method05(){
File file=new File("D:\\java\\d.txt");//windows系统内文件夹名字不区分大小写,最后这个是文件夹的名字
boolean flag=file.mkdir();
System.out.println(flag);
}
//创建文件夹
public static void method06(){
File file=new File("D:\\java\\d\\a\\b");//mkdirs()用于创建多级目录,经常用的方法,不加s不能创建多级目录
boolean flag=file.mkdirs();
System.out.println(flag);
}
}
4、listFiles()方法介绍
import java.io.File;
public class Demo04 {
public static void main(String[] args) {
method03();
}
public static void method01(){
File file=new File("D:\\java");
//获取该路径下的文件和文件夹
String[] arr=file.list();
//遍历
for(String s:arr){
System.out.println(s);//返回文件的全部的名字
}
}
public static void method02(){
File file=new File("D:\\java");
//获取该路径下的文件和文件夹所对应的文件对象
File[] files=file.listFiles();
for(File f:files){
System.out.println(f);//获得的其绝对路径---根本方法
}
}
}
需要注意的是:
①、指定的目录也就是文件夹必须存在;
②、指定的必须是目录。否则会空指针。
4、文件过滤器:
FileFilter 与FilenameFilter都是接口:
public static void method03(){
File file=new File("D:\\java");
//获取该路径下的文件和文件夹所对应(括号内为条件,也就是某个类型)的文件对象
File[] files=file.listFiles(new MyFileFilter());
for(File f:files){
System.out.println(f);//获得的其绝对路径---根本方法
}
}
import java.io.File;
import java.io.FileFilter;
//过滤器:
public class MyFileFilter implements FileFilter{
public boolean accept(File pathname) {
/*//获取文件名
String filename=pathname.getName();
//判断文件名是否以.txt结尾
boolean flag=filename.endsWith(".txt");
return flag;
*/
return pathname.getName().endsWith(".txt");
}
}
三、递归:
在当前方法内调用自己的现象
//递归
public class Demo01 {
public static void main(String[] args) {
int sum=get(100);
System.out.println(sum);
}
//用递归计算1-100的和
public static int get( int num){
if(num==1){
return 1;
}
return num +get(num-1);
}
}
import java.io.File;
public class Demo02 {
public static void main(String[] args) {
File file=new File("D:\\java");
look(file);
}
public static void look(File file){
//获取该路径下所有的文件夹和文件
File[] files=file.listFiles(new MyFilter());//获得.txt文件和文件夹
//遍历
for(File f:files){
//如果是文件夹则继续寻找
if(f.isDirectory()){
look(f);
}else{//如果不是则打印
System.out.println(f);
}
}
}
}
import java.io.File;
import java.io.FileFilter;
public class MyFilter implements FileFilter {
public boolean accept(File pathname) {
//获取以.txt为后缀的文件
//如果是文件夹,那么放到File[]数组内
if(pathname.isDirectory()){
return true;
}
return pathname.getName().endsWith(".JaVa");
}
}
需要注意的是:
1、要保证递归能够停下来;
2、递归次数不能太多;
3、构造方法不能递归使用。