JavaSE笔记15.7-IO流-File类

一. 概述

  • File类用来将文件或者文件夹封装成对象,方便对文件或文件夹进行操作
  • File对象可以作为参数传递给流的构造函数
  • File类不能访问文件内容本身,如果需要访问文件内容本身,则需要使用流

二. 构造方法及常用变量

//如果pathname是实际存在的路径,则该File对象表示的是目录
//如果pathname是文件名,则该File对象表示的是文件
File(String pathname)
//parent是路径名,child是文件名
File(String parent,String child)
//parent是路径对象,child是文件名
File(File parent,String child)

//用于分隔连续多个路径字符串的分隔符,,Windows 下指';',在Linux下指':'
public static final String pathSeparator
//用于分隔同一个路径字符串中的目录,Windows 下指'\\',在Linux下指'/'
public static final String separator

例子:

import java.io.*;
class FileDemo{
    public static void main(String[] args) {
        File f1=new File("C:\\abc");
        File f2=new File("C:\\abc\\a.txt");
        File f3=new File("C:\\abc","b.txt");
        File f4=new File(f1,"c.txt");
        File f5=new File("C:"+File.separator+"abc"+File.separator+"d.txt");

        System.out.println("f1: "+f1);
        System.out.println("f2: "+f2);
        System.out.println("f3: "+f3);
        System.out.println("f4: "+f4);
        System.out.println("f5: "+f5);
    }
}

三. 常用方法

1. 创建

//在指定位置创建文件,如果该文件不存在则创建并返回true,如果该文件已存在则不创建并返回false
//和输出流不一样,输出流对象一建立就创建文件。而且文件已经存在,会覆盖
boolean createNewFile()throws IOException;
//创建文件夹
boolean mkdir();
//创建多级文件夹
boolean mkdirs();

2. 删除

//删除当前文件或者目录;删除成功返回true,删除失败返回false
boolean delete();
//在程序退出时删除指定文件或者目录
void deleteOnExit();

3. 判断

//判断文件或者目录是否存在
boolean exists();
//判断当前File对象表示的文件是否是一个标准文件
boolean isFile();
//判断当前File对象表示的文件是否是一个目录
boolean isDirectory();
//判断当前File对象表示的文件是否是一个绝对路径名
boolean isAbsolute();

4. 获取

//返获取名称
String getName();
//获取路径
String getPath();
//获取父目录名
String getParent();
//获取绝对路径
String getAbsolutePath();
//获取最后一次的修改时间,毫秒值
long lastModified();
//获取长度,字节数
long length()

5. 重命名

//将当前File对象指定的文件更名为给定参数File指定的路径名
boolean renameTo(File dest)

6. 例子

import java.io.*;
class FileDemo{
    public static void main(String[] args) {
        try{
            method();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void method() throws IOException {
        //1. 创建指向文件的File对象
        File f=new File("file.txt");
        //2. 先判断文件是否存在
        if(f.exists()){
            //3. 存在则先删除
            f.delete();
        }
        //4. 再创建文件
        System.out.println("createNewFile:"+f.createNewFile());
        //5. 创建指向目录的File对象
        File f1=new File("abc");
        File f2=new File("ABC\\dd\\ee\\ff");
        //6. 创建目录
        f1.mkdir();
        f2.mkdirs();
        //7. 判断是否是文件或者目录
        System.out.println("f是否是文件:"+f.isFile());
        System.out.println("f1是否是文件:"+f1.isFile());
        System.out.println("f2是否是目录:"+f2.isDirectory());
        //8. 判断是否是绝对路径
        System.out.println("f是否是绝对路径:"+f.isAbsolute());
        //9. 获取路径和绝对路径
        System.out.println("path of f: "+f.getPath());
        System.out.println("absolute path of f: "+f.getAbsolutePath());
        System.out.println("parent of f: "+f.getParent());

        File f3=new File("AutoTest\\file.txt");
        System.out.println("path of f3: "+f3.getPath());
        System.out.println("absolute path of f3: "+f3.getAbsolutePath());
        System.out.println("parent of f3: "+f3.getParent());

        //10. 重命名操作
        File f4=new File("gbk.txt");
        File f5=new File("abc\\rename.txt");
        System.out.println("rename: "+f4.renameTo(f5));
    }
}

运行结果是:
在这里插入图片描述

四. 文件列表功能

//列出可用的文件系统根
static File[] listRoots();

//返回某个目录下所有文件和目录的文件名
//调用list方法的File对象必须是封装了一个目录,否则会报NullPointerException
//如果该目录下为空,则返回数组为空
String[] list();
//返回某个目录下所有满足指定过滤器的文件和目录的文件名
//调用list(FilenameFilter)方法的File对象必须是封装了一个目录,否则会报NullPointerException
//如果该目录下为空,则返回数组为空
String[] list(FilenameFilter filter);

//返回某个目录下所有文件和目录对象
//调用listFiles方法的File对象必须是封装了一个目录,否则会报NullPointerException
//如果该目录下为空,则返回数组为空
File[] listFiles();
//返回某个目录下所有满足指定过滤器的文件和目录对象
//调用listFiles(FilenameFilter)方法的File对象必须是封装了一个目录,否则会报NullPointerException
//如果该目录下为空,则返回数组为空
File[] listFiles(FilenameFilter filter);

1. list(FilenameFilter)方法的原理

内部先调用无参的list()方法,然后实现FilenameFilter接口调用其accept()方法进行过滤,将符合条件的加入到返回数组中

//用于测试指定文件名称是否应包含在文件列表中,当名称应包含在文件列表中时返回true,否则返回false
boolean accept(File dir,String name);
public String[] list(FilenameFilter filter){
	String[] names=list();
	if((name==null)||(filter==null)){
		return names;
	}
	List<String> v=new ArrayList<String>();
	for(int i=0;i<names.length;i++){
		if(filter.accept(this,names[i])){
			v.add(names[i]);
		}
	}
	return v.toArray(new String[v.size()]);
}

2. 例子

import java.io.*;
public class FileDemo2 {
    public static void main(String[] args) {
        listRootsDemo();
        listDemo1();
        listDemo2();
        listFilterDemo1();
        listFilterDemo2();
        listFilterDemo3();
        listFilterDemo4();
    }

    //返回指定目录下,后缀为.bmp的文件对象
    public static void listFilterDemo4(){
        File f=new File("C:\\day18");
        //匿名内部类
        File[] files=f.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith(".bmp");
            }
        });
        System.out.println("len: "+files.length);
        for(File file:files){
            System.out.println(file.getName()+"::"+file.length());
        }
    }

    //返回指定目录下,后缀为.bmp的文件
    public static void listFilterDemo3(){
        File f=new File("C:\\day18");
        //匿名内部类
        String[] names=f.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith(".bmp");
            }
        });
        System.out.println("len: "+names.length);
        for(String name:names){
            System.out.println(name);
        }
    }

    //指定目录下所有文件或目录都符合条件
    public static void listFilterDemo2(){
        File f=new File("C:\\day18");
        //匿名内部类
        String[] names=f.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return true;
            }
        });
        System.out.println("len: "+names.length);
        for(String name:names){
            System.out.println(name);
        }
    }

    //指定目录下所有文件或目录都不符合条件
    public static void listFilterDemo1(){
        File f=new File("C:\\day18");
        //匿名内部类
        String[] names=f.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return false;
            }
        });
        System.out.println("len: "+names.length);
        for(String name:names){
            System.out.println(name);
        }
    }
    
    //列出指定目录下的所有文件或目录对象
    public static void listDemo2(){
        File f=new File("C:\\");
        File[] files=f.listFiles();
        for(File file:files){
            System.out.println(file.getName()+"::"+file.length());
        }
    }
    
    //列出指定目录下的所有文件或目录名称
    public static void listDemo1(){
        File f=new File("C:\\");
        String[] names=f.list();
        for(String name:names){
            System.out.println(name);
        }
    }
    
    //列出可用的文件系统根
    public static void listRootsDemo(){
        File[] files=File.listRoots();
        for(File f:files){
            System.out.println(f);
        }
    }
}

五. 列出目录下所有内容–递归

需求:列出指定目录下的文件或者文件夹,包括子目录中的内容,也就是列出指定目录下所有内容。
分析
因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可;
在列出过程中出现的还是目录的话,还可以再次调用本功能,也就是函数自身调用自身。
这种表现形式,或者编程手法,称为递归

import java.io.*;
public class FileDemo3 {
    public static void main(String[] args) {
        //列出指定目录下所有的内容
        File dir=new File("C:\\200817");
        showDir(dir);
    }
    public static void showDir(File dir){
        System.out.println(dir);
        File[] files=dir.listFiles();
        for(File file:files){
            if(file.isDirectory())
                showDir(file);
            else
                System.out.println(file);
        }
    }
}

六. 删除带内容的目录–递归

在Windows中,删除目录从里面往外删除的。
既然是从里往外删除,就需要用到递归。

import java.io.*;
public class FileDemo4 {
    public static void main(String[] args) {
        //删除指定目录下所有的内容
        File dir=new File("C:\\200818");
        removeDir(dir);
    }
    private static void removeDir(File dir) {
        File[] files=dir.listFiles();
        for(File file:files){
            if(file.isDirectory())
                removeDir(file);
            else
                System.out.println(file+":-file-:"+file.delete());
        }
        System.out.println(dir+":-dir-:"+dir.delete());
    }
}

七. 创建java文件列表文件

需求:将一个指定目录下的java文件的绝对路径,存储到一个文本文件中,建立一个java文件列表文件。
思路

  1. 对指定的目录进行递归
  2. 获取递归过程所有的java文件的路径
  3. 将这些路径存储到集合中
  4. 将集合中的数据写入到一个文件中
import java.io.*;
import java.util.*;
public class JavaFileList {
    public static void main(String[] args) {
        File dir=new File("C:\\200818");
        //用于暂存java文件路径的集合
        List<File> list=new ArrayList<File>();
        //将java文件路径暂存在集合中
        filePathToList(dir,list);

        //用于写入java文件路径的文本文件
        File file=new File(dir,"javaList.txt");
        try{
            //将集合中的数据写入到文件中
            writeToFile(list,file.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void filePathToList(File dir, List<File> list) {
        File[] files=dir.listFiles();
        for(File file:files){
            if(file.isDirectory())
                filePathToList(file,list);
            else{
                if(file.getName().endsWith(".java"))
                    list.add(file);
            }
        }
    }
    private static void writeToFile(List<File> list,String fileName) throws IOException {
        BufferedWriter bufw=new BufferedWriter(new FileWriter(fileName));
        for(File file:list){
            bufw.write(file.getAbsolutePath());
            bufw.newLine();
            bufw.flush();
        }
        bufw.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值