学习笔记:Java_IO(File)

Java_IO(class File)


  • Java的IO流这部分,从四月二十七号到三十号,总共学了三天。三天下来IO流当面的代码写了也有几千行,这里做一下详细的总结。总结按照文件类和流两部分分为两篇文章,这是第一篇。
  • 我所学到的JavaIO流方面的知识主要是皓铭学长给我推荐的网课和教材中的知识,偏重的中心和实际开发中的中心应该还是有一定的差异。
    我所学到的JavaIO流中的知识点分以下几个大部分
    • File(文件)类
    • 文件字节流和文件字符流
    • 缓冲流
    • 对象流
    • 随机读写流
    • 打印流

File 类

概述

  • File类将文件、文件夹(目录)、路径三部分封装,通过这个类的对象可以获得文件本身的一些信息,比如文件是否存在、所在的目录、读写权限、文件的长度等。
  • 文件类对象只负责将数据封装,并不涉及到对文件的读写操作

文件的路径

  • 路径的表示法分为两类,分别是绝对路径和相对路径
  • 绝对路径
    • 在系统中具有唯一性
    • 表示出来是从盘符到文件或目录名的一整个路径
  • 相对路径
    • 表示路径的相对关系
    • 创建文件时如果采用相对路径的创建方法,那么默认新文件创建在当前工程所在的目录,或者当前程序所在的目录下

构造器

  • File的构造器并不关心文件是否存在,文件是否存在由File的exist()实例方法负责判断。
  • 构造器总共有三类:
    1. File (String filename);
    2. File (String directoryPath, String filename);
    3. File (File f, String filaname);
  • 这三种构造器中,第二种更灵活,但是三种都比较常用。第一种构造器中的filename可以是目录也可是文件,而第二种的directoryPath和第三种的f必须是目录。
  • Windows系统不区分大小写,而Linux系统区分,这点要注意。

分隔符

  • 文件类在建立的时候构造器中路径存在中分隔符,分别是路径分隔符和名称分隔符
分隔符类型 File中对应的常量 Windows系统下 Linux系统下
名称分隔符 File.pathSeparator \ /
路径分隔符 File.separator ; :

* 在编程中用File中的变量代替具体的符号可以体现系统无关性,但是在上课的试验中发现,在windows系统下用”/”可以代替”\”,但是不建议这样做。

常用方法总结

  • 文件属性
方法 功能 备注
public String getName() 获取文件或文件夹的名字 这是一个字符串功能,和文件本身的性质无关
public boolean exist() 判断文件是否存在
public long length() 获取文件的长度 单位是字节数,文件的长度即文件的容量
public String getAbsolutePath() 获取文件的绝对路径
public String getParent() 获取文件的父目录 顶层目录(盘符)下返回null
public boolean isFile() 判断文件是否是一个文件
public boolean isDirectory() 判断一个文件是否是目录 和上一个方法返回值相反
public boolean canRead() 判断文件是否可读
public boolean canWrite() 判断文件是否可写 系统文件只可读不可写
public boolean isHidden() 判断文件是否为隐藏文件
  • 文件相关方法
方法 功能 备注
public boolean creatNewFile() 创建新文件 这个方法会抛出IOExecption
public boolean delete() 删除当前文件 删除文件不可逆,直接从硬盘上移除
也可以删除文件夹,但只能删除空文件夹
删除非空文件夹需要递归(演示代码在下边给出)
  • 目录相关方法
方法 功能 备注
public boolean mkdir() 创建一个目录 如果目录已存在不会重新创建,同时返回false
public boolean mkdirs() 创建目录(一层或多层) 和上一个相比这个更常用
public String[] list() 返回目录下全部文件和子目录的名字 无视文件或文件夹是否隐藏
public File[] listFiles() 用File对象形式返回目录下所有文件 这个更常用
public String[] list(FileFilter obj) 按照过滤器obj的规定返回目录下全部文件和子目录的名字
public File[] listFiles(FileFilter obj) 按照过滤器obj的规定用File对象形式返回目录下所有文件

过滤器

  • 使用过滤器用于public String[] list(FileFilter obj)、public File[] listFiles(FileFilter obj)这两种方法中
  • 在使用过滤器时,要向上述两种方法传递一个实现了FilenameFilter接口的对象,其中的FileFilter obj就是过滤器的对象
  • 实现FileFilter接口的对象必须实现一个方法public boolean accept(File pathname),这个方法用于测定指定的抽象路径名是否应包含在某个路径列表,也就是说,当它的返回值为true,上述两种方法的返回之中就包含accept()参数中的pathname文件。只有文件符合条件,过滤器才会让文件加入到上述两种方法的返回值中。

部分功能实例代码

1. 递归实现删除非空文件夹

import java.io.File;

public class deleteList {

    private long fileValue;

    public static void main(String[] args) {
        new deleteList().deleteUnemptyDirectory();
    }

    private void deleteUnemptyDirectory() {

        long startTime = System.currentTimeMillis();
        File file = new File("d:\\javatest");

        if (file.exists() == true) {
            System.out.println("源目录存在并已定位:\n程序开始运行");
            this.fileValue = 0;
        } else {
            System.out.println("源文件不存在,请创建文件后重试");
            System.exit(0);
        }

        this.deleteProcess(file);

        String print = file.exists() == true ? "\n文件删除失败" : "\n文件删除成功";
        System.out.println("程序运行完成" + print +"\n文件夹大小:" + this.fileValue +  
                "\n总计运行时间:\t" + (System.currentTimeMillis() - startTime) + "ms");

    }

    private void deleteProcess(File file) {
        File[] files = file.listFiles();
        for (File temp : files) {
            if (temp.isDirectory() == true) {
                deleteProcess(temp);
            } else {
                this.fileValue += temp.length();
            }
                temp.delete();
        }
        file.delete();
    }

}

2. 利用过滤器遍迭代遍历文件夹

import java.io.File;
import java.io.FileFilter;

public class MyFileFilter implements FileFilter {

    private int count;

    public static void main(String[] args) {
        new MyFileFilter().overRead();
    }

    private void overRead() {

        File file = new File("d:\\java\\javatest");

        System.out.println("第一次遍历开始(不启用过滤器):");
        this.count = 0;
        this.overRead(file);
        System.out.println("第一次遍历结束:\n获取文件总数:\t" + this.count);
        System.out.println("\n第二次遍历开始(启用过滤器):" + "选取以  .java  为后缀名的文件");
        this.count = 0;
        this.overReadWithFilter(file);
        System.out.println("第二次遍历结束:\n获取文件总数:\t" + this.count);

    }

    private void overReadWithFilter(File file) {
        File[] files = file.listFiles(this);
        for (File temp : files) {
            if (temp.isDirectory() == true)
                this.overReadWithFilter(temp);
            else {
                this.count++;
                System.out.println(temp.getAbsolutePath());
            }
        }
    }

    private void overRead(File file) {
        File[] files = file.listFiles();
        for (File temp : files) {
            if (temp.isDirectory() == true)
                this.overRead(temp);
            else {
                this.count++;
                System.out.println(temp.getAbsolutePath());
            }
        }
    }

    public boolean accept(File pathname) {
        if (pathname.isDirectory() == true)
            return true;
        if (pathname.getName().toLowerCase().endsWith(".java") == true)
            return true;
        return false;
    }
}

你可能感兴趣的:(学习笔记)