java 对于文件的操作
对于文件的读写,小猿就不按照往常的文章框架来写这篇文章,小猿以案例为主来编写本章笔记。
文件的创建
文件的创建比较简单,采用 File file = new File(“xxx”) 既可创建文件夹也可以创建文件,对于本小结的内容小猿就不做过多的探讨。
文件的删除
对于文件的删除,小猿就直接献上案例,用java代码直接删除小猿创建的测试文件。
测试代码
public class Demo01Test {
public static void main(String[] args) {
File file = new File("G:\\test");
deleteAllFile(file);
}
public static void deleteAllFile(File file){
System.out.println("-----------------------");
File[] files = file.listFiles();
for (File file1 : files) {
if(file1.isDirectory()){
System.out.println("delete file"+file1);
deleteAllFile(file1);
}else{
file1.delete();
}
}
System.out.println("delete directory:"+file);
file.delete();
System.out.println("-------------------------");
}
}
测试结果
文件查找
案例一的功能需求是展示所有文件夹,代码实现如下所示。
public class Demo04Recurison {
public static void main(String[] args) {
File file = new File("G:\\test");
getAllFile(file);
}
public static void getAllFile(File dir){
System.out.println(dir);
File[] files = dir.listFiles();
for (File f :
files) {
if (f.isDirectory()){
getAllFile(f);
}else {
System.out.println(f);
}
}
}
}
测试结果
测试结果表明所有搜索的文件及文件夹都没有任何问题。
案例二
案例二的需求为输出所有以.txt结尾的文件。先上代码,如下所示。
public class Demo04Recurison {
public static void main(String[] args) {
File file = new File("G:\\test");
findAllFiles(file);
}
public static void findAllFiles(File dir){
File[] files = dir.listFiles();
for (File f :
files) {
if (f.isDirectory()) {
findAllFiles(f);
}else{
if(f.toString().toLowerCase().endsWith(".txt")){
System.out.println(f);
}
}
}
}
}
总而言之,文件搜索的整体思路就是在循环递归遍历文件时,对目标文件进行条件判断,从而选取目标文件。
而搜索文件过滤器,上述代码的缺点就是代码一旦形成就意味着代码的功能就固定了,要想实现不同的功能就必须重新写代码,要想改变这种现状,就必须采用接口给文件搜索功能定义一个固定的模板,
案例三
采用FileFilter过滤器实现文件查找,FileFilter源代码如下。
@FunctionalInterface
public interface FileFilter {
/**
* Tests whether or not the specified abstract pathname should be
* included in a pathname list.
*
* @param pathname The abstract pathname to be tested
* @return <code>true</code> if and only if <code>pathname</code>
* should be included
*/
boolean accept(File pathname);
}
注意,此处接口函数为什么没有abstract类,因为接口默认都是加了abstract函数,且看下面代码。
所以在FileFilter中并没有见到abstract字样,下文小猿将分别用匿名内部类和lambda表达式实现文件过滤案例
方法一(匿名内部类)
小猿直接上代码,首先来写FileFilter接口实现类。
public class FileFilterImpl implements FileFilter{
@Override
public boolean accept(File pathname) {
/*
过滤的规则:
在accept方法中,判断File对象是否是以.java结尾
是就返回true
不是就返回false
*/
//如果pathname是一个文件夹,返回true,继续遍历这个文件夹
if(pathname.isDirectory()){
return true;
}
return pathname.getName().toLowerCase().endsWith(".java");
}
}
测试类
public class Demo01Filter {
public static void main(String[] args) {
File file = new File("c:\\abc");
getAllFile(file);
}
public static void getAllFile(File dir){
File[] files = dir.listFiles(new FileFilterImpl());//传递过滤器对象
for (File f : files) {
if(f.isDirectory()){
getAllFile(f);
}else{
System.out.println(f);
}
}
}
}
方法二(Lambda 表达式实现)
为了复习和巩固上节课采用lambda表达式,方法二将将接口实现类变成lambda表达式
public class Demo02Test {
public static void main(String[] args) {
File file = new File("G:\\test");
getTargetFile(file);
}
public static void getTargetFile(File dir){
//采用匿名内部类的方式
File [] files =null;
/*files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory()||pathname.getName().toLowerCase().endsWith("java");
}
});
//采用lambda表达式。
files=dir.listFiles((File pathname)->{
return pathname.isDirectory()||pathname.getName().toLowerCase().endsWith("java");
});*/
//优化lambda 表达式
files=dir.listFiles((pathname)-> pathname.isDirectory()||pathname.getName().toLowerCase().endsWith("txt"));
for (File file :
files) {
if (file.isDirectory()){
getTargetFile(file);
}else {
System.out.println(file);
}
}
}
}
测试结果:
到此为止,文件的相关操作已经复习完毕,下一章节将复习文件流有关的操作。