zoukankan      html  css  js  c++  java
  • 【Java IO流】File类的使用

    File类的使用

    Java中的File类是在java.io.File中,Java.IO.File类表示文件或目录

    File类只用于表示文件(目录)的信息(名称、大小等),不能用于文件内容的访问。

    一、File类的常用API介绍

    首先在我的d盘下创建一个测试用的文件夹和文本文件,如下图所示:

    1.创建File对象

     我们创建一个File对象来获取测试用的目录,创建File对象最常用的就是通过文件的路径来创建,即File(String 路径),对于同一个路径有 以下三种方式:

    1         /*
    2          * File(String 路径)
    3          */
    4         File file1=new File("D:\code");//用双斜杠进行转义
    5         File file2=new File("D:/code");//用反斜杠
    6         File file3=new File("D:"+File.separator+"code");//File.separator File的静态成员,设置分隔符

    也可以通过File(父目录,子目录)来创建,如:

    1 File file=new File("D:/code","new4");//通过父目录来创建子目录

    等价于

            File file=new File("D:/code/new4");

    2. exists() 判断文件或目录是否存在

    在上述代码下添加如下代码,来看看这个目录是否存在:

    1 System.out.println(file1.exists());
    2 System.out.println(file2.exists());
    3 System.out.println(file3.exists());

    运行结果:

    3.mkdir()和mkdirs() 创建目录或多级目录

     现在我想在刚刚那个目录下再创建一个新的子目录,这时就可以通过mkdir()方法,具体操作如下:

    1 File file4=new File("D:/code/new1");
    2         if(!file4.exists()){
    3             file4.mkdir();//也可以用mkdirs()
    4         }

    运行一下,查看一下刚刚的目录,发现成功创建了一个新的目录:

    那么我想创建多级目录呢?可以通过mkdirs()方法来完成。

    1 File file5=new File("D:/code/new2/new3");//创建多级目录
    2         if(!file5.exists()){
    3             file5.mkdirs();//注意这里不能用mkdir(),只能用mkdirs()
    4         }

    运行之后,查看一下刚刚的目录,发现成功创建了多级目录:

    4.isDirectory()和isFile() 判断是否是目录或者是否是文件

    1 System.out.println("file5是否为目录:"+file5.isDirectory());
    2         System.out.println("fil5是否为文件:"+file5.isFile());
    3         file5.delete();//删除目录
    4         System.out.println("删除file5后是否为目录:"+file5.isDirectory());
    5         File file6=new File("D:/code/hysum.txt");//创建文件
    6         System.out.println("file6是否为目录:"+file6.isDirectory());
    7         System.out.println("file6是否为文件:"+file6.isFile());
    8         file6.delete();//删除文件
    9         System.out.println("删除file6后是否为文件:"+file5.isFile());

    运行结果:

    结果分析:

    isDirectory()和isFile()方法只有当此目录或文件存在且类型匹配的情况下才返回true,不符合两个条件的均返回false!

    5.delete() 删除文件或目录

    6.createNewFile() 创建新文件

    在上面的例子里我删除掉了hysum.txt文件,这里我要通过createNewFile()方法来创建该文件。

     1 if(!file6.exists()){
     2             try {
     3                 file6.createNewFile();
     4             } catch (IOException e) {
     5                 // TODO Auto-generated catch block
     6                 e.printStackTrace();
     7             }
     8         }

    运行完毕之后,查看目录,发现文件创建成功:

    注意:createNewFile()会抛出IOException的异常,可以用try-catch语句捕获或者抛出该异常!


    上述的方法都是最简单的,接下来我们看一下常用的File获取get方法。

    1.getAbsolutePath() 获取绝对路径

    2.getName() 获取文件名称,即当前目录。

    3.getParent() 获取父级路径(创建时的父路径)。

    4.getPath()获取构造file时候的路径

    我们来通过代码看一下上述方法的使用效果;

    1 File file=new File(".","new4");//.代表当前路径,使用相对路径来创建目录
    2         if(!file.exists()){
    3             file.mkdir();
    4             System.out.println("getName()获取文件或目录名称:"+file.getName());
    5             System.out.println("getAbsolutePath()获取绝对路径:"+file.getAbsolutePath());
    6             System.out.println("getParent()获取父级路径:"+file.getParent());
    7             System.out.println("getPath()获取文件目录:"+file.getPath());
    8             
    9         }

    运行结果:

    注意:getParent() 获取父级路径是创建时的父路径,而不是父路径的绝对路径,要获取父路径的绝对路径可以通过file.getParent().getAbsolutePath()来获取。

    -----------------getPath()getAbsolutePath()的不同点-----------------------------

    getPath()得到的是构造file的时候的路径
    getAbsolutePath()得到的是绝对路径。如果构造的时候就是全路径那直接返回全路径;如果构造的时候时是相对路径,返回当前目录的路径+构造file时候的路径

    二、使用File类遍历目录

    上面讲述了File类的一些简单的使用方法,这里稍微复杂一点,我们要学习通过File类来遍历目录,对目录进行一系列的操作。

    这里我新建了一个File类的工具类,名为FileUtils。这个类的功能是:列出File的一些常用操作比如过滤、遍历等操作。把这些操作包装成一个工具类,以后使用这个工具类对File对象进行这些操作就方便多了。

    首先选一个测试目录,就是刚刚那个d盘的code目录,往里面添加几个文本文件。

    ---------------------------------FileUtils类方法----------------------------------------

    ---------------列出指定目录下(包括其子目录)的所有文件---------------

    列出目录下的文件方法有两种:list()和listFiles(),这两种方法有什么区别呢?

    先看第一种方法list(),它返回的是String类型的数组

     1 public static void listDirectory(File dir) throws IOException{
     2     if(!dir.exists()){//目录不存在,抛出异常
     3         throw new IllegalArgumentException("该目录不存在");
     4     }
     5     if(!dir.isDirectory()){//不是一个目录
     6         throw new IllegalArgumentException("不是一个目录");
     7     }
     8     String[] filenames=dir.list();//list()方法返回一个String数组
     9     for (String string : filenames) {
    10         System.out.println(string);
    11     }
    12     
    13 }

    主方法调用结果:

    结果分析:可以看出list() 返回的是该目录下直接所有子目录和文件的名称,但不包含子目录下的内容。

    那如何才能遍历到子目录下的文件呢?

    如果要遍历目录下的内容就需要构造成File对象做递归操作,File提供了直接返回File对象的API,那就是listFiles()方法。

    我把刚刚的方法修改后如下:

     1 public class FileUtils {
     2     /*
     3      * 列出指定目录下(包括其子目录)的所有文件
     4      */
     5     public static void listDirectory(File dir) throws IOException {
     6         if (!dir.exists()) {// 目录不存在,抛出异常
     7             throw new IllegalArgumentException("该目录不存在");
     8         }
     9         if (!dir.isDirectory()) {// 不是一个目录
    10             throw new IllegalArgumentException("不是一个目录");
    11         }
    12         File[] files = dir.listFiles();
    13         if (files != null && files.length > 0) {// 判断是否含有子目录
    14             for (File file : files) {
    15                 if (file.isDirectory()) {// 如果是子目录,则做递归
    16                     listDirectory(file);
    17                 } else {// 如果是文件,则打印输出
    18                     System.out.println(file);
    19                 }
    20 
    21             }
    22         }
    23 
    24     }

    运行结果:

    可以看到成功遍历了所有子目录下的文件并输出了。

    -------------总结---------------

    file.list() 返回的是 字符串数组 直接子目录的名称不包含子目录下的内容

    file.listFiles() 返回的是直接子目录(文件)的对象。


    这里只列出了几种常用的方法,更多File类的内容请自行查阅API哦~

    File类只用于表示文件或目录,不能用于文件内容的访问;

    而RandomAccessFile类提供的对文件内容的访问,既可以读文件,也可以写文件。

    下期预告《RandomAccessFile类的使用》

  • 相关阅读:
    坑爹的 Segmentation fault
    静态全局变量得初始化
    新冠肺炎的感受
    \r和\n的区别
    程序里面带有浮点数,默认会自动转换为double类型存储
    Relativity : Fictitious forces
    Biology 04: The Senses
    156 TCP协议的三次握手和四次挥手
    155 大白话OSI七层协议
    154 互联网和互联网的组成
  • 原文地址:https://www.cnblogs.com/hysum/p/7219211.html
Copyright © 2011-2022 走看看