您的位置:首页 > 编程语言 > Java开发

Java中的File类详解

2020-03-22 07:16 393 查看

文章目录

  • 三、File类小练习
  • 使用IO流可以将存储从内存转换为在磁盘上持久化。IO流,解决的是文件的传输问题。所有的输入输出,都是站在内存的角度去考虑。

    需要明确的几个知识点

    • File类的一个对象,代表一个文件或一个文件目录(即文件夹)。
    • File类的声明在java.io包下。
    • File类仅涉及文件的创建、删除、重命名、修改时间、文件大小等功能。并未涉及写入或读取文件的操作。写入或读取的操作由IO流完成。
    • 路径中的每级目录之间用一个路径分隔符隔开。
    • 路径分隔符和系统有关:
    • windows和DOS系统默认使用"
      \
      "来表示
    • UNIX和URL使用"
      /
      "来表示
  • Java程序支持跨平台运行,因此路径分隔符要慎用。
  • 为了解决这个隐患,File类提供了一个常量:public static final String separator。根据操作系统,动态的提供分隔符。
  • 例:
  • File file1 = new File("d:\\Program Files\\info.txt");//windows和DOS中的分隔符
    File file2 = new File("d"+File.separator+"Program Files"+File.separator+"info.txt");//兼容性写法
    File file3 = new File("d:/Program Files");//UNIX中的分隔符

    路径分隔符问题了解即可,实际上在windos开发中使用

    /
    充当分隔符,也是可以识别出来的。

    一、如何实例化一个File对象

    Java中提供了四种构造器来实例化一个File对象,下面对前三种构造器进行演示。

    • File(String pathname)
    • File(String parent, String child)
    • File(File parent, String child)
    @Test
    public void test1(){
    //File(String pathname)构造器
    File file1 = new File("hello.txt");//相对于当前module
    File file2 = new File("D:\\Program Files\\JAVA\\workspace_idea\\JavaSenior\\com.java.io\\hello2.txt");//绝对路径
    System.out.println("file1 = " + file1);
    System.out.println("file2 = " + file2);
    
    //File(String parent, String child) 构造器
    File file3 = new File("D:\\Program Files","JAVA");
    System.out.println("file3 = " + file3);
    
    //File(File parent, String child)构造器
    File file4 = new File(file3,"hi.txt");
    System.out.println("file4 = " + file4);
    }

    打印结果如下:

    二、File类的几个常用方法

    如果需要判断文件是否存在,是否可读可写,文件长度是多少,最近的修改日期等。这些问题,通过File文件本身就可以做。

    1.获取文件属性

    • 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 file = new File("hello.txt");
    
    System.out.println("file的绝对路经:" + file.getAbsolutePath());
    System.out.println("file的路经:" + file.getPath());
    System.out.println("file的名称:" + file.getName());
    System.out.println("file的上层文件目录路径:" + file.getParent());
    System.out.println("file的长度:" + file.length());
    System.out.println("file最后一次修改的时间:" + new Date(file.lastModified()));
    System.out.println();
    
    //下面的两个方法适用于文件目录
    File file1 = new File("D:\\Program Files\\JAVA");
    
    String[] list = file1.list();
    System.out.println("遍历 JAVA 目录下的文件名:");
    for (String s : list) {
    System.out.println(s);
    }
    System.out.println();
    
    File[] files = file1.listFiles();
    System.out.println("遍历 JAVA 目录下的文件的绝对路径:");
    for(File f:files){
    System.out.println(f);
    }
    }

    打印结果如下:

    之所以file的上层目录路径为null是因为,使用的是相对路径。

    2.重命名文件

    • public boolean renameTo(File dest); 把文件重命名为指定的文件路径名。
    • 以file1.renameTo(file2)为例,要想保证返回true,需要file1在硬盘中是存在的,而file2不能在硬盘中存在。
    • 该方法不仅可以修改文件名,也可以修改文件路径。
    @Test
    public void test3() {
    File file1 = new File("d:\\test1.txt");//硬盘上存在test1.txt
    File file2 = new File("d:\\AAA\\test2.txt");//硬盘上不存在test2.txt
    boolean b = file1.renameTo(file2);
    System.out.println(b);
    }

    上面的测试执行后,成功将test1.txt文件转移到d://AAA路径下并将名称修改为test2.txt。

    3.判断文件功能

    • public boolean isDirectory();判断文件是否是文件目录。
    • public boolean isFile();判断是否是文件。
    • public boolean exists();判断是否存在。
    • public boolean canRead();判断是否可读。
    • public boolean canWrite();判断是否可写。
    • public boolean isHidden();判断是否隐藏。
    @Test
    public void test4(){
    File file = new File("hello.txt");//该文件在硬盘中存在
    System.out.println("是否是文件目录:"+file.isDirectory());
    System.out.println("是否是文件:"+file.isFile());
    System.out.println("是否存在:"+file.exists());
    System.out.println("是否可读:"+file.canRead());
    System.out.println("是否可写:"+file.canWrite());
    System.out.println("是否隐藏:"+file.isHidden());
    }

    执行结果如下:

    4.创建文件\文件夹

    使用构造器实例化一个File,只是在内存中创建了这个对象。下面介绍的File类的创建方法才是真正在硬盘上创建一个文件或文件目录。

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

    注意:如果在创建文件或创建文件目录时,没有写盘符路径, 默认在项目路径下。

    创建文件:

    @Test
    public void test5() throws IOException {
    File file = new File("hi.doc");//在磁盘创建一个文件
    if (!file.exists()) {
    file.createNewFile();
    System.out.println("创建成功");
    } else {
    file.delete();
    System.out.println("删除成功");
    }
    }

    创建文件时,使用后缀表名需要创建的文件类型,若文件在磁盘中存在则不创建。

    创建文件夹:

    @Test
    public void test6() {
    File file = new File("d:\\aa");//在磁盘创建一个文件夹
    boolean mkdir = file.mkdir();//若上层目录不存在,返回false
    if (mkdir) {
    System.out.println("创建成功");
    } else {
    System.out.println("创建失败");
    }
    
    File file1 = new File("d:\\bb\\cc\\dd");
    boolean mkdirs = file1.mkdirs();//若上层目录不存在,一并创建
    if (mkdirs) {
    System.out.println("创建成功");
    } else {
    System.out.println("创建失败");
    }
    }

    创建文件夹有mkdir和mkdirs两个方法,两者的区别在于上层目录不存在时的做法,mkdir直接返回false,mkdirs则一并创建上层目录。

    5.删除文件

    • public boolean delete(); 删除文件或文件夹。

    删除方法在上面的创建文件中已经有演示,这里不做赘述。删除时,该文件目录内不能包含文件或文件目录。另外需注意:Java中的删除不走回收站。

    File类的介绍到此结束,后续的IO流中File类的对象常会作为参数传递到流的构造器中,指明读入或写出的"终点"。

    三、File类小练习

    学习了上面的File类实例化对象,和使用常用方法在磁盘上操作文件后。通过下面三个小练习,熟悉对File类的操作。

    File练习1

    利用File构造器,实例化一个文件目录file(磁盘上已经创建好d:\aa\hello.txt)。
    1)创建一个与file同级目录下的文件和文件夹。
    2)编写方法,实现删除一个文件的操作。

    练习1代码:

    @Test
    public void exercise1() throws IOException {
    File file = new File("d:\\aa\\hello.txt");
    
    File file1 = new File(file.getParent(),"bb");
    file1.mkdir();//创建文件夹
    File file2 = new File(file.getParent(),"cc.doc");
    file2.createNewFile();//创建文件
    
    file.delete();//删除
    }

    程序运行前:

    程序运行后:

    File练习2

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

    方法一:使用String[] list();

    @Test
    public void exercise2_1() {
    File file = new File("D:\\桌面整理\\公共课\\图片素材");//这是我的电脑上一个装有图片的文件夹
    String[] list = file.list();
    for (String s : list) {
    if (s.endsWith(".jpg")) {
    System.out.println(s);
    }
    }
    }

    方法二:使用File[] listFiles();

    @Test
    public void exercise2_2() {
    File file = new File("D:\\桌面整理\\公共课\\图片素材");//这是我的电脑上一个装有图片的文件夹
    File[] listFiles = file.listFiles();
    for (File f : listFiles) {
    if (f.getName().endsWith(".jpg")) {
    System.out.println(f.getName());
    }
    }
    }

    方法三:使用FileFilter过滤器

    @Test
    public void exercise2_3() {
    File file = new File("D:\\桌面整理\\公共课\\图片素材");//这是我的电脑上一个装有图片的文件夹
    File[] listFiles = file.listFiles(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
    return name.endsWith(".jpg");
    }
    });
    for (File f : listFiles) {
    System.out.println(f.getName());
    }
    }

    三者输出结果都一样:

    File练习3

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

    代码实现如下:

    package File;
    
    import java.io.File;
    
    /**
    * Class description:
    * 续File练习题
    *
    * @guoqianliang
    */
    public class exe_File2 {
    /**
    * 遍历指定目录所有文件名称,包括子文件目录中的文件。
    * 1)并计算指定目录占用空间的大小。
    * 2)删除指定文件目录及其下的所有文件。
    */
    public static void main(String[] args) {
    File dir = new File("D:\\xxx");
    printdir(dir);//递归遍历目录
    System.out.println(getDirectorySize(dir));//递归计算目录占用空间大小
    deleteDirectory(dir);//删除所有文件
    }
    
    private static void printdir(File dir) {//递归
    //如果是文件夹就输出名称并递归,如果是文件就仅获取名称.
    File[] listFiles = dir.listFiles();
    for (File f : listFiles) {
    if (f.isDirectory()) {
    System.out.println(f.getName());
    printdir(f);
    } else {
    System.out.println(f.getName());
    }
    }
    }
    
    private static long getDirectorySize(File file) {//递归
    //如果是文件就累加,如果是文件夹就递归
    long size = 0;
    if (file.isFile()) {
    size += file.length();
    } else {
    File[] listFiles = file.listFiles();
    for (File f : listFiles) {
    size += getDirectorySize(f);
    }
    }
    return size;
    }
    
    private static void deleteDirectory(File file) {
    //如果是文件直接删掉,如果是文件夹先删除它的下一级再删除它
    if (file.isDirectory()) {
    File[] listFiles = file.listFiles();
    for (File f : listFiles) {
    deleteDirectory(f);
    }
    }
    file.delete();
    }
    }
    • 点赞
    • 收藏
    • 分享
    • 文章举报
    郭乾亮1998. 发布了444 篇原创文章 · 获赞 1328 · 访问量 34万+ 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: