Java中使用File类对文件操作详解!


我们可以知道,存储在程序中的数据是暂时的,在程序终止的时候,存储在程序中的数据就会丢失。为了永久地保存在程序中创建的数据,我们需要将它们 存储到磁盘上或者其他永久存储设备的文件中,这些文件之后可以被其他的程序传输和读取,这就是持久化的过程。

而java.io包下的File实用类库就可以被运用操作这些文件,File封装了在用户机器上处理文件系统所需要的所有功能。

官方给的定义是:代表的是文件或者目录路径名的抽象。

This class presents an abstract, system-independent view of hierarchical pathnames.

可以说,这个类提供了一个抽象的、与系统无关的层次路径名视图。

不同风格的分隔符

  • 在windows系统中,用\间隔目录,用;间隔不同的路径。
  • 在Linux或unix中,用/间隔目录,用:间隔不同的路径。

java为了屏蔽不同操作系统的差异性,提供了File.separator表示间隔符,提供了File.pathSeparator间隔不同路径。当然这两个是String类型,另外两个为Char类型,作用相同。

绝对与相对路径

绝对路径(absolute):以盘符或者/开头的路径。
相对路径(relative):相较于某个路径下才指明的路径。

在IDEA的main()方法中测试,相对路径是当前的Project下。

    File file = new File("newFile");
    System.out.println(file.getAbsolutePath());
    //D:\Java_Project\Java_Learn_samples\newFile

File类常用方法

常用构造器

File(String pathname) //传入一个路径名(文件or目录)
File(String parent, String child) //在目录parent下创建一个子路径对象
File(File parent, String child) //在目录parent下创建一个子路径对象,区别是parent本身就是File对象

下面是创建File对象的一个例子,需要注意的是,创建对象并不意味着创建了一个真实的文件,而是一种抽象,可以通过这个File对象进行相应的操作。

//以绝对路径名作为参数,创建一个File对象。
File file = new File("D:\\newFile.txt");

我们之前提到,windows系统中目录层级之间的分隔符是反斜杠\,Java中反斜杠是一个转义字符,所以要表示\,需要写成\\

创建方法

下面的三个方法用以创建文件或者创建目录,都有返回的boolean值。

  • 创建文件 public boolean createNewFile()
    用以创建文件,创建成功返回true。但是如果该文件已经存在,则返回false。
  • 创建目录 public boolean mkdir()
    用以创建文件目录,创建成功返回true。但是需要注意的是:同样的,如果目录已经存在,则返回false,如果该文件目录的上层目录不存在,也不会创建。
  • 创建多级目录 public boolean mkdirs()
    同样是创建文件目录,如果已经存在,则返回false。但是和上面不同的是,如果上层目录不存在,它会一并创建

需要注意:如果创建File对象时,传入的路径名没有指定盘符,则为相对路径名,在项目路径下。

判断方法

下面的方法都是以public boolean修饰的方法,用以判断。

获取方法

  • 关于getPathgetAbsolutePath产生的疑惑?为啥这两个产生的结果相同呢?

于是我进行了新的测试:

    File file = new File("newFile");
    file.getAbsolutePath(); //D:\Java_Project\Java_Learn_samples\newFile
    file.getPath();         //newFile

这次我以相对路径名作为参数传入,结果显而意见。getAbsolutePath返回的是默认带着项目路径的绝对路径名,而getPath只是将传入的路径名原原本本地返回。

命名方法

public boolean renameTo(File dest)
把文件重命名为指定地文件路径,如果成功,返回true。

删除方法

public boolean delete()
删除文件或者目录。

  • 一旦删除成功,无法在回收站复原,是不可逆的。
  • 如果待删除的目录里面包含着文件或者子目录,则其不能被删除,我们可以通过下面的方法递归删除包含内容的目录。
  • 删除完整的目录。
    /**
     * 静态方法,删除完整的目录
     * @param file 传入File对象
     */
    public static void deleteDirectory(File file){
        //判断file对象是文件还是目录
        if(file.isDirectory()){
            //如果是目录,获取子文件和子目录列表
            File[] fs = file.listFiles();
            //遍历数组
            for(File f :fs){
                //递归删除
              deleteDirectory(f);
            }
        }
        //最后的无论是啥,都需要删除
        file.delete();
    }

文件过滤器

  • 关于产生的文件列表,其实还有list()方法,只不过它的返回值类型是String[]。list()和listFiles()都有传入参数是FilenameFilter接口类型的重载方法。
public interface FilenameFilter {
    boolean accept(File dir, String name);
}

我们可以通过匿名内部类,对产生的列表进行操作:

    //打印该目录下的java文件
    File path = new File("module01\\src\\com\\my\\FileTest");
    File[] list;
    //通过匿名内部类返回FilenameFilter的引用
    list = path.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            //选择接收.java结尾的文件
            return name.endsWith(".java");
        }
    });
    for (File l : list)
        System.out.println(l.getName());

可以通过Lambda表达式更加简化:

    //打印该目录下的java文件
    File path = new File("module01\\src\\com\\my\\FileTest");
    File[] list;
    //通过匿名内部类返回FilenameFilter的引用
    list = path.listFiles((dir, name) -> name.endsWith(".java"));
    for (File l : list)
        System.out.println(l.getName());

File的静态方法

  • public static File createTempFile(String prefix, String suffix):在默认的临时文件目录中创建一个临时的空文件,文件名为:prefix + [random value] + suffix
  • public static File createTempFile(String prefix, String suffix,File directory):可以指定directory作为指定的目录,在该目录下创建临时文件。
  • public static File[] listRoots():列出系统所有的根路径。
    public static void main(String[] args) throws IOException {

        //在当前目录下创建tempxxx.txt临时文件
        File file = new File(".");
        File tempFile = File.createTempFile("temp", ".txt", file);
        //jvm退出时删除该文件
        tempFile.deleteOnExit();

        System.out.println("当前路径下所有文件和路径");
        Arrays.stream(Objects.requireNonNull(file.list()))
                .forEach(System.out::println);

        System.out.println("系统所有的根路径");
        File[] files = File.listRoots();
        for (File f : files) {
            System.out.println(f);
        }

    }
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值