Java - File类的详解及练习

2023-12-13 23:57:08

目录

3.1 概述

3.2 File类的静态成员变量

3.3 绝对路径和相对路径

3.4 File类构造方法

3.5 File类的获取方法

3.6 File类判断方法

3.7 File类创建删除功能的方法

3.8 File类目录遍历方法

3.9 FileFilter接口

?面试题:Files的常用方法都有哪些?

3.10 练习题


3.1 概述

  • File类位于Java.io包下,本章中涉及到的相关流也都声明在java.io包下。

  • File类的一个对象,对应于操作系统下的一个文件或一个文件目录(文件夹)

  • File类中声明了新建、删除、获取名称、重命名等方法,并没有涉及到文件内容的读写操作。要想实现文件内容的读写,我们就需要使用io流。

  • File类的对象,通常是作为io流操作的文件的端点出现的。

    • 代码层面:将File类的对象作为参数传递到IO流相关类的构造器中。

3.2 File类的静态成员变量

  • static String pathSeparator 与系统有关的路径分隔符。

    • Window操作系统,分隔符是分号。

    • Linux操作系统,分隔符是冒号。

  • static String separator 与系统有关的默认名称分隔符。

    • Window操作系统,名称分割符号为 \。

    • Linux操作系统,名称分隔符号为 /。

3.3 绝对路径和相对路径

  • 绝对路径:以Windows操作系统为例,包括盘符在内的文件或文件目录的完整路径。

  • 相对路径:相对于某一个文件目录来讲的相对的位置。

    • 在Idea中,如果使用单元测试方法:相对于当前的module来讲

    • 如果使用main()方法,相对于当前的project来讲。

String path = "d:\\aaa\bbb\ccc\a.txt";//带盘符 绝对路径
String path2 = "a.txt"; //相对路径

?

3.4 File类构造方法

  • public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。

  • public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。

  • public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。

🧀实例1:(public File(String pathname)

package day1120;

import java.io.File;

public class TestDemo2 {
    public static void main(String[] args) {
        //创建文件对象f1,f1所指的文件是在当前目录下创建的a.txt
        File f1=new File("a.txt");

    }
}

🧀实例2:(public File(String parent, String child)

package day1120;

import java.io.File;

public class TestDemo2 {
    public static void main(Stringargs) {
        //注意C:目录实现必须存在,否则异常。
        File f2=new File("C:","a.txt");


    }
}

?🧀实例3:

public static void main(String[] args){
    // 文件路径名
    String pathname = "D:\\aaa.txt";
    File file1 = new File(pathname); 
    System.out.println(file1);

    // 通过父路径和子路径字符串
    String parent = "d:\\aaa";
    String child = "bbb.txt";
    File file2 = new File(parent, child);
    System.out.println(file2);
    
    // 通过父级File对象和子路径字符串
    File parentDir = new File("d:\\aaa");
    String child = "bbb.txt";
    File file3 = new File(parentDir, child);
    System.out.println(file3);
}

注意

  1. 一个File对象代表硬盘中实际存在的一个文件或者目录。

  2. 无论该路径下是否存在文件或者目录,都不影响File对象的创建。

3.5 File类的获取方法

  • public String getAbsolutePath() :返回此File的绝对路径名字符串。

  • public String getPath() :将此File转换为路径名字符串。

  • public String getName() :返回由此File表示的文件或目录的名称。

  • public long length() :返回由此File表示的文件的长度。

  • public File getParentFile()返回由此File表示的文件或目录的父目录,如果没有父目录,返回null。

  • public long lastModfied()获取最后一次的修改时间,毫秒值。

public static void main(String[] args) {
    File f = new File("d:/aaa/bbb.java");     
    System.out.println("文件绝对路径:"+f.getAbsolutePath());
    System.out.println("文件构造路径:"+f.getPath());
    System.out.println("文件名称:"+f.getName());
    System.out.println("文件长度:"+f.length()+"字节");
    System.out.ptintln("文件路径的父路径"+f.getParentFile());

    File f2 = new File("d:/aaa");     
    System.out.println("目录绝对路径:"+f2.getAbsolutePath());
    System.out.println("目录构造路径:"+f2.getPath());
    System.out.println("目录名称:"+f2.getName());
    System.out.println("目录长度:"+f2.length());
    System.out.ptintln("目录父路径"+f2.getParentFile());
}

3.6 File类判断方法

  • public boolean exists() :此File表示的文件或目录是否实际存在。

  • public boolean isDirectory() :此File表示的是否为目录。

  • public boolean isFile() :此File表示的是否为文件。

public static void main(String[] args) {
    File f = new File("d:\\aaa\\bbb.java");
    File f2 = new File("d:\\aaa");
    // 判断是否存在
    System.out.println("d:\\aaa\\bbb.java 是否存在:"+f.exists());
    System.out.println("d:\\aaa 是否存在:"+f2.exists());
    // 判断是文件还是目录
    System.out.println("d:\\aaa 文件?:"+f2.isFile());
    System.out.println("d:\\aaa 目录?:"+f2.isDirectory());
}

?

3.7 File类创建删除功能的方法

  • public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。

  • public boolean delete() :删除由此File表示的文件或目录。 不进回收站,直接删除。

注意事项:

①Java中的删除不走回收站

②要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。

  • public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。

package day1211;

import java.io.File;
import java.io.IOException;

public class testDemo03 {
    public static void main(String[] args) {
        File file = new File("C:\\software\\javaproject\\decode\\src\\test\\hello.java");
        //测试文件的创建与删除
        if(!file.exists()){
            try {
                Boolean isSuccessed=file.createNewFile();
                if(isSuccessed){
                    System.out.println("创建成功");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }else{
            System.out.println("此文件已存在");
            file.delete();
            System.out.println("文件删除成功");
        }
    }
}

?

3.8 File类目录遍历方法

  • public File[] listFiles()返回一个File数组,表示该File目录中的所有的子文件或目录.

public static void main(String[] args) {
    File dir = new File("C:\\software\\javaproject\\decode\\src\\test");
    //获取当前目录下的文件以及文件夹对象,只要拿到了文件对象,那么就可以获取更多信息
    File[] files = dir.listFiles();
    for (File file : files) {
            System.out.println(file);
    }
}

?结果:

?

3.9 FileFilter接口

  • public File[] listFiles(FileFilter filter)返回一个File数组,表示该File目录中的所有的子文件或目录,filter是文件过滤器,可以过滤不需要的文件。

文件过滤器接口,此接口的实现类可以传递给方法listFiles(),实现文件的过滤功能

FileFilter接口方法:

public boolean accept(File path):方法参数就是listFiles()方法获取到的文件或者目录的路径。如果方法返回true,表示需要此路径,否则此路径将被忽略。

遍历目录,获取所有的Java文件

public static void main(String[] args){
    File dir = new File("d:\\demo");
    File[] files = dir.listFiles(new FileFilter() {
    @Override
    public boolean accept(File pathname) {
        //判断如果获取到的是目录,直接放行
        if(pathname.isDirectory())
        return true;
        //获取路径中的文件名,判断是否java结尾,是就返回true
        return pathname.getName().toLowerCase().endsWith("java");
      }
    });
    for(File file : files){
            System.out.println(file);
    }
}

?面试题:Files的常用方法都有哪些?

  • exist,

  • isFile

  • isDirectory

  • listFile()

  • creatnewFile

  • mkdirs

3.10 练习题

1. 创建一个与hello.txt文件在相同文件目录下的另一个名为abc.txt文件

package day1211;

import java.io.File;
import java.io.IOException;

public class testDemo03 {
    public static void main(String[] args) {
        File file1=new File("C:\\software\\javaproject\\decode\\src\\test\\hello.txt");
        if(file1.exists()){
            File dir=file1.getParentFile();
            File file2=new File(dir,"abc.txt");
            try {
                file2.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2. 判断指定目录(C:\Users\35014\Desktop\大数据\java\img)下是否有后缀名为.png的文件,如果有,就输出该文件名称

package day1211;

import java.io.File;
import java.io.IOException;

public class testDemo03 {
    public static void main(String[] args) {
        File dir=new File("C:\\Users\\35014\\Desktop\\大数据\\java\\img");
        File[] files=dir.listFiles();
        for(File file:files){
            if(file.getName().endsWith(".png")){
                System.out.println(file.getName());
            }
        }
    }
}

?结果:

?

3. 遍历指定文件目录下的所有文件的名称,包括子文件目录中的文件

Public void prindFileName(File file) //file可能是文件,也可能是文件目录

package day1204;

import java.io.File;

public class testDemo04 {
    public static void main(String[] args) {
        File file2=new File("C:\\software\\javaproject\\decode\\src");
        printFileName(file2);
    }

        public static void printFileName (File file){
            if (file.isFile()) {
                System.out.println(file.getName());
            } else if (file.isDirectory()) {
                File[] files = file.listFiles();
                for (File f : files) {
                    printFileName(f);
                }
            }
        }
}

结果

4. 拓展1: 删除指定文件目录及其下的所有文件

Public void deleteDirectory(File file) //file可能是文件,也可能是文件目录

//删除指定文件目录及其下的所有文件
    public static void deleteDirectory(File file){ //file可能是文件,也可能是文件目录
        if(file.isFile()){
            file.delete();
        }else if(file.isDirectory()){
            File[] files=file.listFiles();
            for(File f:files){
                deleteDirectory(f);
            }
        }
    }

这个代码只能删除文件目录里面的文件,无法删除文件目录本身,可以将file.delete();放在后面等里面的都删完之后,再将其自身也删掉

//删除指定文件目录及其下的所有文件
public static void deleteDirectory(File file){ //file可能是文件,也可能是文件目录
    if(file.isDirectory()){
        File[] files=file.listFiles();
        for(File f:files){
            deleteDirectory(f);
        }
    }
    file.delete();
}

5. 计算指定文件目录占用空间的大小

Public long getDirectorySize(File file) //file可能是文件,也可能是文件目录。

方法1

package day1204;

import java.io.File;

public class testDemo4 {
    public static void main(String[] args) {
        File file2 = new File("C:\\software\\javaproject\\decode\\src\\Detele");
        System.out.println(getDirectorySize(file2));
    }
    
    static long sum = 0;
    public static long getDirectorySize(File file) {
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isFile()) {
                sum = sum + f.length();
            } else {
                getDirectorySize(f);
            }
        }
        return sum;
    }
}

方法2

package day1204;

import java.io.File;

public class testDemo4 {
    public static void main(String[] args) {
        File file2 = new File("C:\\software\\javaproject\\decode\\src\\test11");
        System.out.println(getDirectorySize(file2));
    }


    public static long getDirectorySize(File file) {
        long sum=0;

        if(file.isFile()){
            sum=file.length();
        }else {
            File[] files = file.listFiles();
            for (File f : files) {
                sum = sum + getDirectorySize(f);
            }
        }
        return sum;
    }
}

文章来源:https://blog.csdn.net/weixin_40968325/article/details/134981327
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。