美文网首页
Java IO之File类的使用

Java IO之File类的使用

作者: 程序员汪汪 | 来源:发表于2021-03-31 22:55 被阅读0次

File类的理解

  • File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)。
  • File类声明在java.io包下:文件和文件路径的抽象表示形式,与平台无关。
  • File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。
  • 想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。
  • 后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的”终点“。

File类的实例化

常用构造器

File(String filePath)
File(String parentPath,String childPath)
File(File parentFile,String childPath)

代码示例:

public class FileTest {

    @Test
    public void test1() {
        // 现在的 file 还只是内存、对象层面的,硬盘中并没有这个文件
        // 构造器1
        File file1 = new File("hello.txt");
        File file2 = new File("D:\\code\\JavaSE\\src\\javase\\io\\file\\hello.txt");
        System.out.println(file1);
        System.out.println(file2);

        // 构造器2
        File file3 = new File("D:\\code\\JavaSE\\src\\javase\\io\\file", "hello");
        System.out.println(file3);

        // 构造器3
        File file4 = new File(file3, "hello3.txt");
        System.out.println(file4);
    }
}

路径分类

  • 相对路径:相较于某个路径下,指明的路径
  • 绝对路径:包含盘符在内的文件或文件目录的路径。

说明:

  • IDEA中:
    • 如果使用JUnit中的单元测试方法测试,相对路径即为当前Module下。
    • 如果使用main()测试,相对路径即为当前的Project下。
  • Eclipse中:
    • 不管使用单元测试方法还是使用main()测试,相对路径都是当前的Project下。

路径分隔符

  • Windows和DOS系统默认使用\来表示
  • UNIX和URL使用/来表示
  • Java程序支持跨平台运行,因此路径分隔符要慎用。
  • 为了解决这个隐患,File类提供了一个常量: public static final String separator。根据操作系统,动态的提供分隔符。

举例:

//Windows和DOS系统 使用 “/”其实也是可以的
File file1 = new File("E:\\io\\test.txt");
//UNIX和URL
File file = new File("E:/io/test.txt");
//java提供的常量
File file = new File("E:"+File.separator+"io"+File.separator+"test.txt");

File类的常用方法

File类的获取功能

  • public String getAbsolutePath():获取绝对路径
  • public String getPath() :获取路径
  • public String getName() :获取名称
  • public String getParent():获取上层文件目录路径。若无,返回null
  • public long length():获取文件长度(即:字节数)。不能获取目录的长度。
  • public long lastModified():获取最后一次的修改时间,毫秒值

如下的两个方法适用于文件目录:

  • public String[] list():获取指定目录下的所有文件或者文件目录的名称数组
  • public File[] listFiles():获取指定目录下的所有文件或者文件目录的File数组

代码示例:

@Test
public void test2() {
    File file1 = new File("hello.txt");
    File file2 = new File("D:\\io\\hi.txt");

    System.out.println(file1.getAbsolutePath());
    System.out.println(file1.getPath());
    System.out.println(file1.getAbsolutePath());
    System.out.println(file1.getPath());
    System.out.println(file1.getName());
    System.out.println(file1.getParent());
    System.out.println(file1.length());
    System.out.println(new Date(file1.lastModified()));

    System.out.println();

    System.out.println(file2.getAbsolutePath());
    System.out.println(file2.getPath());
    System.out.println(file2.getName());
    System.out.println(file2.getParent());
    System.out.println(file2.length());
    System.out.println(file2.lastModified());
}

@Test
public void test3() {
    File file = new File("D:\\code\\JavaSE\\src\\javase");
    String[] list = file.list();
    for (String s : list) {
        System.out.println(s);
    }

    System.out.println();

    File[] files = file.listFiles();
    for (File f : files) {
        System.out.println(f);
    }
}

File类的重命名功能

  • public boolean renameTo(File dest):把文件重命名为指定的文件路径
  • 注意:file1.renameTo(file2)为例:要想保证返回true,需要file1在硬盘中是存在的,且file2不能在硬盘中存在
@Test
public void test4(){
    File file1 = new File("hello.txt");
    File file2 = new File("D:\\io\\hi.txt");

    boolean renameTo = file2.renameTo(file1);
    System.out.println(renameTo);

}

File类的判断功能

  • public boolean isDirectory():判断是否是文件目录
  • public boolean isFile() :判断是否是文件
  • public boolean exists() :判断是否存在
  • public boolean canRead() :判断是否可读
  • public boolean canWrite() :判断是否可写
  • public boolean isHidden() :判断是否隐藏

代码示例:

@Test
public void test5(){
    File file1 = new File("hello.txt");
    file1 = new File("hello1.txt");

    System.out.println(file1.isDirectory());
    System.out.println(file1.isFile());
    System.out.println(file1.exists());
    System.out.println(file1.canRead());
    System.out.println(file1.canWrite());
    System.out.println(file1.isHidden());

    System.out.println();

    File file2 = new File("d:\\io");
    file2 = new File("d:\\io1");
    System.out.println(file2.isDirectory());
    System.out.println(file2.isFile());
    System.out.println(file2.exists());
    System.out.println(file2.canRead());
    System.out.println(file2.canWrite());
    System.out.println(file2.isHidden());

}

File类的创建功能

创建硬盘中对应的文件或文件目录

  • public boolean createNewFile():创建文件。若文件存在,则不创建,返回false
  • public boolean mkdir():创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
  • public boolean mkdirs():创建文件目录。如果此文件目录存在,就不创建了。如果上层文件目录不存在,一并创建

代码示例:

@Test
public void test6() throws IOException {
    File file1 = new File("hi.txt");
    if (!file1.exists()) {
        // 文件的创建
        file1.createNewFile();
        System.out.println("创建成功");
    } else {
        file1.delete();
        System.out.println("删除成功");
    }
}

@Test
public void test7() {
    // 文件目录的创建
    File file1 = new File("D:\\io1\\io2\\io3");
    boolean mkdir = file1.mkdir();
    if (mkdir) {
        System.out.println("创建成功1");
    }

    File file2 = new File("D:\\io1\\io2\\io4");
    boolean mkdir1 = file2.mkdirs();

    if (mkdir1) {
        System.out.println("创建成功2");
    }

    // 要想删除成功,io4文件目录下不能有子目录或文件
    File file3 = new File("D:\\io1\\io2\\io4");

    System.out.println(file3.delete());
}

File类的删除功能

删除磁盘中的文件或文件目录。

public boolean delete():删除文件或者文件夹(不能有文件或者子文件夹)。

删除注意事项:Java中的删除不走回收站。

内存解析

内存解析

小练习

利用File构造器,new一个文件目录file。要求:在其中创建多个文件和目录,编写方法,实现删除file中指定文件的功能。

public class FileTest2 {

    @Test
    public void test() throws IOException {
        File file = new File("D:\\io\\io1");    //先创建文件夹
        if (!file.exists()) {
            file.mkdirs();
        }
        File haha = new File("D:\\io\\io1\\haha.txt");
        // 创建一个与haha同目录下的另外一个文件,文件名为:xixi.txt
        File xixi = new File(haha.getParent(), "xixi.txt");
        // 如果 D:\io\io1 这个路径不存在,就会报错java.io.IOException: 系统找不到指定的路径。
        boolean newFile = xixi.createNewFile();
        if (newFile) {
            System.out.println("创建成功!");
        }else {
            System.out.println("文件已存在!");
        }

        // 删除xixi.txt
//        boolean flag = deleteFile(xixi);
//        if (flag) {
//            System.out.println("文件删除成功!");
//        } else {
//            System.out.println("文件不存在!");
//        }
    }

    public boolean deleteFile(File file) {
        if (file.exists()) {
            return file.delete();
        } else {
            return false;
        }
    }
}

判断指定目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称。

public class FindJPGFileTest {

    @Test
    public void test1() {
        File src = new File("D:\\io\\io1");
        String[] fileNames = src.list();
        if (fileNames.length == 0) {
            System.out.println("没有找到.jpg图片!");
        } else {
            for (String fileName : fileNames) {
                if (fileName.endsWith(".jpg")) {
                    System.out.println(fileName);
                }
            }
        }

    }

    @Test
    public void test2() {
        File srcFile = new File("D:\\io\\io1");
        File[] listFiles = srcFile.listFiles();
        if (listFiles.length == 0) {
            System.out.println("没有找到.jpg文件!");
        } else {
            for (File file : listFiles) {
                if (file.getName().endsWith(".jpg")) {
                    System.out.println(file.getAbsolutePath());
                }
            }
        }

    }
    /**
     *  File 类提供了文件过滤器方法
     *  public String[] list(FilenameFilter filter)
     *  public File[] listFiles(FileFilter filter)
     *  public File[] listFiles(FilenameFilter filter)
     * */

    @Test
    public void test3() {
        File srcFile = new File("D:\\io\\io1");
        File[] listFiles = srcFile.listFiles((dir, name) -> name.endsWith(".jpg"));
//        File[] listFiles = srcFile.listFiles(new FilenameFilter() {
//            @Override
//            public boolean accept(File dir, String name) {
//                return name.endsWith(".jpg");
//            }
//        });
        if (listFiles.length == 0) {
            System.out.println("没有找到.jpg文件!");
        } else {
            for (File file : listFiles) {
                System.out.println(file.getAbsolutePath());
            }
        }

    }
}

遍历指定目录所有文件名称,包括子文件目录中的文件。拓展1:计算指定目录占用空间的大小。拓展2:删除指定文件目录及其下的所有文件。

public class ListFileTest {

    @Test
    public void test1() {

        // 1. 创建目录对象,请确保路径是存在的
        File file = new File("D:\\io");

        // 2. 使用递归遍历指定目录下的所有文件及文件夹(包含自身)
        printSubFile(file);
        // 计算指定目录占用空间大小
        System.out.println(getDirectorySize(file));
        // 使用递归删除指定文件目录及其下的所有文件
        deleteDirectory(file);
    }

    /**
     * 使用递归遍历指定目录下的所有文件和文件夹(包括目录自身)
     * @param dir
     */
    public void printSubFile(File dir) {
        System.out.println(dir.getAbsolutePath());
        File[] files = dir.listFiles();
        if (files.length != 0) {
            for (File f : files) {
                if (f.isDirectory()) {  // 如果是文件夹,则递归调用自身
                    printSubFile(f);
                } else {
                    System.out.println(f.getAbsolutePath()); // 输出文件绝对路径
                }
            }
        }


    }

    /**
     * 拓展1:求指定目录所占用空间的大小
      */
    public long getDirectorySize(File file) {
        // file是文件,那么直接返回file.length()
        // file是目录,把它的下一级目录的所有文件大小加起来就是它的总大小
        long size = 0;
        if (file.isFile()) {
            size += file.length();
        } else {
            File[] files = file.listFiles(); // 获取当前文件夹下的文件或文件夹
            for (File f : files) {
                size += getDirectorySize(f);
            }
        }
        return size;
    }

    /**
     * 拓展2:删除指定的目录(包含目录中的子目录及文件)
     */
    public void deleteDirectory(File file) {
        // 如果file是文件,直接delete
        // 如果file是目录,先把它的子目录以及文件删除,然后删除自己
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files.length != 0) { // 如果 length == 0;说明是最后一个文件夹,并且是空的
                for (File f : files) {
                    deleteDirectory(f); // 递归调用
                }
            }
            file.delete(); // 删除空文件夹
        }
        file.delete(); // 删除文件
    }

}

相关文章

  • Java入门系列-22-IO流

    File类的使用 Java程序如何访问文件?通过 java.io.File 类 使用File类需要先创建文件对象 ...

  • Chapter 9 . Java IO

    阅读原文 Chapter 9 . Java IO 9.1 IO---File 类 java.io.File类:文件...

  • Java-I/O学习(4)

    Java-I/O学习(4) File Java IO 的File类可以帮助你访问底层的文件系统,使用File类你可...

  • java-IO输入输出流

    一.java.io.File类 java.io.File类用于表示文件/目录 File只用于表示文件的信息(名称,...

  • JAVA 中的 IO 流

    File 类的使用 java.io.File 类:文件和文件目录路径的抽象表示形式,与平台无关 File 能新建、...

  • Java IO之File类的使用

    File类的理解 File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)。 File类声明在java.i...

  • Java IO 第1篇:带你认识 File 类

    带你认识 File 类 一、初识 Java IO Java IO 操作主要指的是使用Java进行输入、输出操作,J...

  • Java入门—输入输出流

    File类的使用 文件是:文件可认为是相关记录或放在一起的数据的集合。Java中,使用java.io.File类对...

  • Java基础之IO

    一、File类 File类是java.io包下代表与平台无关的文件或目录,你可以使用File类来新建、删除、重命名...

  • Java篇-IO处理

    一 : 文件 凡是与输入输出相关的类,接口等定义在java.io包下File类->java.io.File.Fil...

网友评论

      本文标题:Java IO之File类的使用

      本文链接:https://www.haomeiwen.com/subject/nxczhltx.html