20、File文件

这篇博客详细介绍了Java中的File类,包括构造方法、文件创建与删除、判断操作、剪切重命名、获取信息及过滤方法。接着讨论了递归的概念,并提供了案例。此外,还深入讲解了IO流的基本概念、OutputStream及其子类FileOutputStream,以及相关操作方法。最后,给出了多个实战练习,如递归删除、统计文件类型数量和文件内容复制等。

一、File

  1. 文件和目录路径的抽象表现形式,可以以文件或者文件路径构建成一个File对象,然后可以对该文件进行操作
  2. 相对路径:相对于参照物的路径,idea中多使用相对路径
  3. 绝对路径:从盘符开始的
1.1、file的构造方法
方法名描述
[File](…/…/java/io/File.html#File(java.io.File, java.lang.String))(File parent, String child)根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例
File(String pathname)通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例
[File](…/…/java/io/File.html#File(java.lang.String, java.lang.String))(String parent, String child)根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File(URI uri)通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。
1.2、创建方法
方法名描述
booleancreateNewFile()当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
booleanmkdir()创建此抽象路径名指定的目录
booleanmkdirs()创建此抽象路径名指定的目录,包括所有必需但不存在的父目录
1.3、删除文件及空文件夹
方法名描述
booleandelete()删除此抽象路径名表示的文件或目录
1.4、判断方法
方法名描述
booleanexists()测试此抽象路径名表示的文件或目录是否存在。
boolean isFile()测试此抽象路径名表示的文件是否是一个标准文件
boolean isDirectory()测试此抽象路径名表示的文件是否是一个目录
1.5、剪切并重命名到指定文件
方法名描述
booleanrenameTo(File dest)剪切调用者的文件内容到dest文件中
1.6、获取的方法
方法名描述
public String getAbsolutePath()返回此抽象路径名的绝对路径名字符串
public String getPath()返回File构造方法中的路径
public String getParent()返回此抽象路径名父目录的路径名字符串
public String getName()返回由此抽象路径名表示的文件或目录的名称
public long length()返回由此抽象路径名表示的文件的长度
1.7、过滤方法
方法名描述
public String[] list()返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录(一级目录下所有的目录以及文件)
public String[] list(FilenameFilter fifilter)返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目
public File[] listFiles(FilenameFilter fifilter)返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录
public File[] listFiles(FileFilter fifilter)返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录
public File[] listFiles()返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件和目录。
1.8、练习
package com.la.demo;
import java.io.File;
import java.io.FileFilter;
import java.util.Scanner;
public class TestFile5 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        boolean flag=true;
        do {
            System.out.println("请输入文件目录");
            String next = scanner.next();
            File file = new File(next);
            if (file.exists()){
                if (file.isDirectory()){
                    file.listFiles(new FileFilter() {
                        @Override
                        public boolean accept(File pathname) {
                            if (pathname.getName().endsWith("java")&&pathname.length()>5*1024){
                                System.out.println(pathname.getName());
                                return true;
                            }
                            return false;
                        }
                    });
                    flag=false;
                }else {
                    System.out.println("你输入的不是目录");
                }

            }else {
                System.out.println("目录有误,请重新输入文件目录");
            }

        }while (flag);
    }
}
1.9、练习
package com.la.demo;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.Arrays;
public class TestFile2 {
    public static void main(String[] args) {
        File file = new File("E:\\home");
        String[] list = file.list();
        System.out.println(Arrays.toString(list));
        String[] jpgs = file.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                if (name.endsWith("jpg")) {
                    return true;
                }
                return false;
            }
        });
        System.out.println(Arrays.toString(jpgs));

        File[] files = file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
//                System.out.println("--------------------------");
//                System.out.println(pathname);
                String path = pathname.getPath();
                System.out.println(path);
                if (path.endsWith("jpg")||path.endsWith("gif")||path.endsWith("jpeg")){
                    return true;
                }
                return false;
            }
        });
        File[] list1 = file.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                if (name.endsWith("jpg") || name.endsWith("gif") || name.endsWith("jpeg")) {
                    return true;
                }
                return false;
            }
        });
        System.out.println(Arrays.toString(files));
        System.out.println(Arrays.toString(list1));
    }
}

二、递归

  1. 自己调用自己,朝着不递归方向发展,方法参数会逐渐变小

  2. 案例

package com.la.demo;
import java.io.File;
public class TestFile3 {
    public static void main(String[] args) {
        deleteFile(new File("E:\\home\\c"));
    }
    public static void deleteFile(File file){
        File[] files = file.listFiles();
        for (File file1 : files) {
            if (file1.isDirectory()){
                deleteFile(file1);
            }else {
                file1.delete();
            }
        }
        file.delete();
    }
}
  1. 练习
package com.la.demo;
import java.io.File;
public class TestFile4 {
    public static void main(String[] args) {
        seeImage(new File("C:\\Users\\longao\\Desktop\\图片"));
    }
    public static void seeImage(File file){
        if (file!=null){
            if (file.isDirectory()){
                File[] files = file.listFiles();
                if (files!=null&&files.length>0){
                    for (File file1 : files) {
                        seeImage(file1);
                        String name = file1.getName();
                        if (name.endsWith("jpg")||name.endsWith("png")||name.endsWith("gif")||name.endsWith("jpeg")){
                            System.out.println(name);
                        }
                    }
                }
            }
        }
    }
}

三、IO流

3.1、概述
  1. 使用场景:文件的复制;文件的上传和下载;qq的及时通信
  2. 分类:流向:输入流和输出流;类型:字节流和字符流
  3. 万物皆字节,字节一般读取音频,字符一般读取纯文件(字符=字节流+编码表)
3.2、OutPutStream输出流
  1. A.OutputStream 是一个抽象类 ;B.OutputStream 输出字节流的所有类的超类

  2. 常用子类FileOutPutStream、ObjectOutPutStream

  3. 常用方法

方法名描述
public void close()关闭流资源
public void flush()将缓冲区的数据刷新到硬盘中
public abstract void write(int b)一个一个字节来写入
public void write(byte[] b)将字节数组内容来写入
public void write(byte[] b, int off, int len)将字节数组指定长度的内容进行写入

四、FileOutPutStream

  1. A.文件输出流是用于将数据写入 File ==>将数据写入到文件中

    B.FileOutputStream 用于写入诸如图像数据之类的原始字节的流

    C.要写入字符流,请考虑使用 FileWriter

  2. 构造方法

方法名描述
public FileOutputStream(File file)创建一个向指定 File 对象表示的文件中写入数据的文件输出流
public FileOutputStream(String name)创建一个向具有指定名称的文件中写入数据的输出文件流
public FileOutputStream(String name, boolean append)创建一个向具有指定 name 的文件中写入数据的输出文件流(如果为false则从文件的开头写入,如果为true从文件内容的末尾进行写入)
  1. 构造方法的三件事

​ A.实例化FileOutputStream

​ B.创建一个空的文件

​ C.将FileOutputStream 指向这个空的文件

  1. 案例
package com.la.demo;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class TestFileOutputStream {
    public static void main(String[] args) throws Exception {
        OutputStream outputStream=new FileOutputStream("e:\\1.txt");
        outputStream.write(97);
        OutputStream outputStream1=new FileOutputStream("e:\\2.txt");
        outputStream1.write(new byte[]{97,98,99});
        OutputStream outputStream2=new FileOutputStream("e:\\3.txt",true);
        outputStream2.write(97);
        String s="97 98 99";
        byte[] bytes = s.getBytes();
        outputStream2.write(bytes);
    }
}

五、练习

  1. 递归删除图片
package com.la.demo1;
import java.io.File;
public class DeleteImage {
    public static void main(String[] args) {
        deleteImage(new File("e:\\home"));
    }
    public static void deleteImage(File file){
        if (file.exists()){
            if (file.isFile()){
                if (file.getName().endsWith("png")||file.getName().endsWith("gif")||file.getName().endsWith("jpeg")||file.getName().endsWith("jpg")){
                    file.delete();
                }
            }else{
                File[] files = file.listFiles();
                if (files!=null&&files.length>0){
                    for (File file1 : files) {
                         deleteImage(file1);
                    }
                }
            }
        }
    }
}
  1. 获取一个文件夹下不同文件类型的数量
package com.la.demo1;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class CountFile {
   static  HashMap<String, Integer> map = new HashMap<>();
    public static void main(String[] args) {
        Map<String, Integer> count = count(new File("E:\\home"));
        Set<Map.Entry<String, Integer>> entries = count.entrySet();
        for (Map.Entry<String, Integer> entry : entries) {
            System.out.println(entry.getKey()+":"+entry.getValue());
        }

    }
    public static Map<String,Integer> count(File file){
        if (file.exists()){
            if (file.isFile()){
                String substring = file.getName().substring(file.getName().indexOf(".")+1);
                if (map.containsKey(substring)){
                    map.put(substring,map.get(substring)+1);
                }else {
                    map.put(substring,1);
                }
            }else {
                File[] files = file.listFiles();
                if (files!=null&&files.length>0){
                    for (File file1 : files) {
                        count(file1);
                    }
                }
            }
        }
        return map;
    }
}
  1. 一个文件内容复制到另一个文件中
package com.la.demo1;
import java.io.*;
public class CopyFile {
    public static void main(String[] args) {
        try {
            copyFile(new File("e:\\home\\1.txt"),new File("e:\\home\\a\\1.txt"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void copyFile(File sFile, File dFile)throws Exception {
        InputStream in = new FileInputStream(sFile);
        OutputStream out = new FileOutputStream(dFile, true);
        long n = sFile.length();
        int b = (int) n;
        byte[] a = new byte[b];
        in.read(a, 0, b);
        out.write(a, 0, b);
        in.close();
        out.close();
    }
}
  1. 学生的增删改查
package com.la.demo2;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Student {
    private String sid;
    private String name;
    private int age;
    private Date birthday;

    public Student(String sid, String name, int age, Date birthday) {
        this.sid = sid;
        this.name = name;
        this.age = age;
        this.birthday = birthday;
    }

    public Student() {
    }

    public String getSid() {
        return sid;
    }

    public void setSid(String sid) {
        this.sid = sid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sid='" + sid + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +"岁"+
                ", birthday=" + new SimpleDateFormat("yyyy-MM-dd").format(birthday) +
                '}';
    }
}
package com.la.demo2;
        import java.text.ParseException;
        import java.text.SimpleDateFormat;
        import java.util.Collection;
        import java.util.Date;
        import java.util.HashMap;
        import java.util.Scanner;
public class StudentManage {
    static HashMap<String,Student> map= new HashMap<>();
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println("\t\t\t"+"欢迎来到学生管理系统");
        boolean flag=true;
        do {
            System.out.println("请选择你的操作:1.添加学生、4.删除学生、3、修改学生、2、查看学生、5、退出系统");
            int i = scanner.nextInt();
            switch (i){
                case 1:{
                    System.out.println("请输入学生的学号:");
                    String sid = scanner.next();
                    System.out.println("请输入学生的姓名:");
                    String name = scanner.next();
                    System.out.println("请输入学生的年龄:");
                    int age = scanner.nextInt();
                    System.out.println("请输入学生的生日:格式(yyyy-MM-dd)");
                    String next2 = scanner.next();
                    Date birthday=null;
                    try {
                        birthday= simpleDateFormat.parse(next2);
                    } catch (ParseException e) {
                        System.out.println("日期输入有误");;
                    }
                    if (!map.containsKey(sid)){
                        map.put(sid,new Student(sid,name,age,birthday));
                    }else {
                        System.out.println("该学生已存在,请勿重复操作");
                    }
                    break;
                }
                case 2:{
                    Collection<Student> values = map.values();
                    for (Student value : values) {
                        System.out.println(value);
                    }
                    break;
                }
                case 3:{
                    System.out.println("请输入要修改的学生的学号:");
                    String sid = scanner.next();
                    if (map.containsKey(sid)){
                        System.out.println("请输入要修改的学生的姓名:");
                        String name = scanner.next();
                        System.out.println("请输入要修改的学生的年龄:");
                        int age = scanner.nextInt();
                        System.out.println("请输入要修改的学生的生日:格式(yyyy-MM-dd)");
                        String next2 = scanner.next();
                        Date birthday=null;
                        try {
                            birthday= simpleDateFormat.parse(next2);
                        } catch (ParseException e) {
                            System.out.println("日期输入有误");
                        }
                        map.put(sid,new Student(sid,name,age,birthday));
                    }
                    break;
                }
                case 4:{
                    System.out.println("请输入要删除的学生学号:");
                    String sid = scanner.next();
                    map.remove(sid);
                    break;
                }
                case 5:{
                    System.exit(0);
                    break;
                }
                default:{
                    System.out.println("输入有误,请重新输入");
                    break;
                }
            }
        }while (flag);

    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值