JAVA常用类(十一):File类

目录

File类:

构造方法:

成员方法:

过滤器的使用:

高级获取遍历文件:

递归遍历文件的操作:


File类:

文件和目录(文件夹)路径名的抽象表示形式。 ----------  仅仅是一个路径的表示,不代码具体的事物一定是存在的。( IO流的基础 )

文件:本质上存储二进制码。.txt表示以文本来翻译,后缀名表示选择哪种解析方式。

构造方法:

public File(String  pathname);

public File(String parent , String child);

public File( File parent , String child);

注:使用File类实例化的对象,是不能确定它是文件还是目录(文件夹),在文件存在的情况下需要使用isFile/isDirection方法进行判断。同时构造方法中的文件名可以随意创建,但是否存在是依靠exists()方法判断的。

import java.io.File;
public class FileDemo1 {
	public static void main(String[] args) {
		File f = new File("G:\\图片\\050.jpg");  //构造方法中的文件名可以随意创建,但是否存在是依靠方法判断的。
		File f1 = new File("G:/图片");
		
		File f2 = new File("G:/图片","050.jpg");
		
		File f3 = new File(f1,"050.jpg");
	}
}

成员方法:

创建:

public boolean createNewFile()  ----------- 创建新文件,返回true则创建成功,反之失败。若已存在同名文件,则返回false

public boolean mkdir() -----------------------  创建单级目录的文件夹,即只能创建一层不存在目录。

public boolean mkdirs() ---------------------  创建多级目录的文件夹,即创建多层不存在目录。

删除:

public boolean delete() -----------------------  删除单个文件/目录:若文件夹(目录)下包含内容,则删除失败。

重命名:

public boolean renameTo(File dest) -----  对文件/夹重命名,本质是文件的移动。

注:File类创建对象是不区分文件和目录的,只有通过mkdir(s)方法创建的才是目录,使用creatNewFile()方法创建的才是文件,与是否有后缀无关,后缀名只是告诉程序默认使用那种方式来解析文件

import java.io.File;
import java.io.IOException;
public class FileDemo2 {
	public static void main(String[] args) {
		File f = new File("G:\\图片\\050.jpg");
		try {
			boolean b = f.createNewFile();
			System.out.println(b);   //false,存在已有同名文件则显示创建失败
			//目录==文件夹
			File f2 = new File("G:\\a\\b");
			f2.mkdir();
			File f3 = new File("G:/a/ab/c"); //代表的是c这个文件夹
			f3.mkdirs();
			
			File f4 = new File("G:/456");
			f4.createNewFile();
			File f5 = new File("G:/789.txt");
			f5.mkdir();
			
			f4.delete();
			f3.delete();  //删除的是c这个文件夹
			f2.delete();  //如果文件夹中有内容时删除不了的(a文件夹下有内容)
			
			f5.renameTo(new File("G:/a/门神.jpg"));  //重命名的本质是:文件的移动
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

判断:

public boolean isDirectory() ---------------------------- 判断是否是一个文件夹/目录

public boolean isFile() ------------------------------------ 判断是否是一个文件

public boolean exists() ----------------------------------- 判断文件/夹是否存在

public boolean canRead() ------------------------------- 判断文件/夹是否可读

public boolean canWrite() ------------------------------  判断文件是否可写

public boolean isHidden() ------------------------------ 判断文件/夹是否隐藏

public class FileDemo3 {
	public static void main(String[] args) {
		//构造方法中的文件名可以随意创建,但是否存在是依靠方法判断的。
		File f = new File("djasd");
		System.out.println(f.exists());  //false
		//G:/图片/050.jpg 该路径存在
		File f1 = new File("G:/图片/050.jpg");
		System.out.println(f1.isDirectory()); //false
		System.out.println(f1.isFile());  //true
		System.out.println(f1.canRead());  //true
		//文件--右键--属性
		System.out.println(f1.canWrite()); //true
		System.out.println(f1.isHidden()); //false
	}
}

获取:

public String getAbsolutePath()  -------------------------- 获取文件的绝对路径(比较常用

public String getPath() --------------------------------------- 获取文件的相对路径

public String getName() ------------------------------------- 获取文件的名称(比较常用

public long length() ------------------------------------------- 获取文件的容量大小(占用字节),若是文件夹则返回不确定值

public long lastModified() ---------------------------------- 获取最后的修改时间(毫秒值)

public class FileDemo4 {
	public static void main(String[] args) throws IOException {
		File f = new File("G:\\图片\\Pictures\\125.jpg");
		System.out.println(f.exists());  //true
		System.out.println(f.getAbsolutePath()); //G:\图片\Pictures\\125.jpg
		System.out.println(f.getPath());  //G:\图片\Pictures\\125.jpg
		System.out.println(f.getName());  //125.jpg
		
		File f2 = new File("002.txt"); 
		System.out.println(f2.createNewFile());  //true
		//D:\developSoftware\workspace\java\javase05\javase05\002.txt -- 绝对路径
		System.out.println(f2.getAbsolutePath()); 
		//002.txt -- 相对路径  --  默认的基准路径eclipse工作空间项目路径
		System.out.println(f2.getPath());
		
		File f3 = new File("G:\\图片\\Pictures\\125.jpg");
		System.out.println(f3.length()); //3162813
		System.out.println(f3.lastModified()); //1526287442000 获取最后修改时间
		Date d = new Date(f3.lastModified());
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		System.out.println(sdf.format(d)); //2018-05-14
	}
}

高级获取:针对文件夹(包含子文件)----------------- 是遍历文件的一种方法(另一种是递归)

public String[ ] list()  ------------------ 将所有的子文件字符串放入字符串数组中

public File[ ] listFiles() --------------- 将所有的子文件对象放入File数组中,更加常用,listFiles()的重载方法包含两种过滤器

public class FileDemo5 {
	public static void main(String[] args) {
		File f1 = new File("G:/图片");
		String[] list = f1.list();
		for(String s:list) {
			System.out.println(s);
		}
		System.out.println("======================");
		File[] listFiles = f1.listFiles();  //listFiles()返回对象数组,使用范围更广一些
		for (File f : listFiles) {
			System.out.println(f);  //直接以字符串的形式输出对象的属性信息,File类重写了toString方法
		}
	}
}

过滤器的使用:

public File[ ] listFiles ( FilenameFilter  filter)------------  重写accept(File dir, String name):dir 文件夹    name 文件名

public File[ ] listFiles ( FileFilter  filter) -------------------  重写 accept(File pathname) :pathname为绝对路径的File类对象

实现过滤器FilenameFilter / FileFilter接口的对象可以过滤文件,重写accept()方法,将判断条件写在返回值上,返回true则不过滤,返回false则过滤。相较于直接使用listFiles(),listFiles( 过滤器接口对象 )的效率要更高一些。------- 使用见下一节案例

高级获取遍历文件:

案例:单级目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称。  ------------  四种方法实现

public class Demo03 {
	public static void main(String[] args) {
		findFiles("G:/图片",".jpg");
		findFiles2("G:/图片",".jpg");	
	}
	//list()方法不能解决文件夹名包含后缀的情况,因此使用第二种遍历方式
	public static void findFiles(String path,String filename) {
		File f = new File(path);
		String[] list = f.list();
		String s1 = filename;
		for (String s : list) {
			if(s.toLowerCase().endsWith(s1.toLowerCase())) {
				System.out.println(s);
			}	
		}
	}
	//listFiles()返回File类型的数组,能够调用File类的成员方法,因此更常用一些。
	public static void findFiles2(String path,String filename) {
		//1.把路径转为File对象
		File f = new File(path);
		//2.获取所有子文件
		File[] list = f.listFiles();
		//遍历这个文件夹
		if(list!=null && list.length>0) {  //首先判断File[]是否为空,此时不能使用&,当File[]为空时调用.length方法容易出现空指针异常
			for (File file : list) {
				//file.isFile()判断是否是文件,toLowerCase()都转成小写,以此来解决区分大小写问题
				if(file.isFile() && file.getName().toLowerCase().endsWith(filename.toLowerCase()))
					System.out.println(file.getAbsolutePath());
			}
		}
	}
	//使用过滤器来遍历
	public static void findFiles3(String path,String suffix) {
		//1.把路径封装成File
		File f = new File(path);
		//2.使用过滤器获取子文件/夹
		File[] listFiles = f.listFiles(new FilenameFilter() {	
			/**
			 * dir:文件夹   -- G:/图片
			 * name:每一个文件的名字
			 */
			@Override
			public boolean accept(File dir, String name) {
				//newFile为绝对路径的File对象
				File newFile = new File(dir,name);
				if(newFile.isFile() && name.toLowerCase().endsWith(suffix.toLowerCase())) {
					System.out.println(newFile.getAbsolutePath());
					return true;  //true表示存入
				}
				return false; //false表示不存入
			}
		});
	}
	public static void findFiles4(String path,String suffix) {
		//1.把路径封装成File
		File f = new File(path);
		//2.使用过滤器获取子文件/夹
		File[] listFile = f.listFiles(new FileFilter() {		
			@Override
			public boolean accept(File pathname) {
				if(pathname.isFile() && pathname.getName().toLowerCase().endsWith(suffix.toLowerCase())) {
					System.out.println(pathname.getAbsolutePath());
					return true;  //true表示存入
				}
				return false;
			}
		});
	}
}

递归遍历文件的操作:

案例:递归遍历目录下指定后缀名结尾的文件名称

1.把路径包装成File类对象f;

2.判断 f 是文件还是文件夹:文件 ------ 判断是否以后缀名结尾

                                             文件夹 --- 拿到所有的子文件;转成字符串逐个传入本方法中进行递归调用

public class Demo02 {
	public static void main(String[] args) {
		findAllFiles("G:/图片",".jpg");
	}
	public static void findAllFiles(String path,String suffix) {
		//1.把path包装成File
		File f = new File(path);
		//2.判断f是文件夹还是文件
		if(f.isFile()) {  //文件
			//判断是否是suffix结尾:
			if(f.getName().toLowerCase().endsWith(suffix.toLowerCase())) {
				System.out.println(f.getAbsolutePath());
			}
		}else {    //文件夹
			//拿到所有的子文件
			File[] fileList = f.listFiles();
			if(fileList!=null && fileList.length>0) {  //
				//遍历
				for (File file : fileList) {
					//递归调用
					findAllFiles(file.getAbsolutePath(),suffix);
				}
			}
		}
	}
}

案例:递归删除一个带内容的文件夹(带内容的文件夹不可直接删除)

1.将路径包装成File类对象f;

2.判断f是文件还是文件夹:文件 ---- 删除

                                            文件夹 ---- 获取所有的子文件,进行递归判断,直至删除文件夹下所有的子文件

3.最后把自己的文件夹删掉。

public class Demo03 {
	public static void main(String[] args) {
		deleteAllFiles("h:/temp");
	}
	public static void deleteAllFiles(String path) {
		//1.把path包装成File
		File f = new File(path);
		//2.判断 是文件还是文件夹
		if(f.isFile()) {  //文件
			f.delete();
		}else {  //文件夹
			File[] file = f.listFiles();
			//递归删除文件夹中的子文件
			if(file!=null && file.length>0) { //file!=null防止出现空指针异常;file.length>0判断是否有文件存在
				for (File file2 : file) {
					deleteAllFiles(file2.getAbsolutePath());
				}
			}
		}
		//最后把自己删除掉
		f.delete();
		System.out.println("删除成功!");
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值