Java基础之IO—File类4月打卡day23

举报
java厂长 发表于 2022/04/13 09:28:15 2022/04/13
【摘要】 Java基础之IO—File类4月打卡day23关于作者作者介绍🍓 博客主页:作者主页🍓 简介:JAVA领域优质创作者🥇、一名在校大三学生🎓、在校期间参加各种省赛、国赛,斩获一系列荣誉🏆。🍓 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿👨‍💻。IO—File类1、基本操作如果要想学好IO,必须要清楚抽象类、IO的操作部分掌握两个代码...

Java基础之IO—File类4月打卡day23

关于作者

  • 作者介绍


🍓 博客主页:作者主页

🍓 简介:JAVA领域优质创作者🥇、一名在校大三学生🎓、在校期间参加各种省赛、国赛,斩获一系列荣誉🏆。

🍓 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿👨‍💻。

IO—File类

1、基本操作

如果要想学好IO,必须要清楚抽象类、IO的操作部分掌握两个代码模型。IO的核心组成五个类(File、OutputStream、InputStream、Writer、Reader)一个接口(Serializable)。

再java.io是一个与文本本身操作有关的程序(创建、删除、信息取得---)

如果要想使用File类操作文件的话,那么肯定要通过构造方法实例化File类对象,而实例化File类对象的过程之中主要使用以下两种构造方法:

  1. 方法一:public File(String pathname);

  2. 方法二:public File(File parent,String child).

文件的基本操作,主要有以下几种功能:

  • 创建一个新文件:public boolean createNewFile() throws IOException

  • 删除文件:public Boolean delete();

  • 判断路径是否存在:public Boolean exists();

创建新文件

package com.day14.demo;
​
import java.io.File;
import java.io.IOException;
​
public class FileDemo {
    public static void main(String[] args) throws IOException {
        File file = new File("f:\\hello.txt");
        file.createNewFile();
    }
}

如果文件存在进行删除,不存在进行创建

package com.day14.demo;
​
import java.io.File;
import java.io.IOException;
​
public class FileDemo {
    public static void main(String[] args) throws IOException {
        File file = new File("f:\\hello.txt");  
        if(file.exists()){//文件存在
            file.delete();
        }else{//文件不存在
            file.createNewFile();//创建文件
        }
    }
}

本程序操作就表示如果文件存在则删除,如果不存在则创建一个新的文件,此时基本功能是实现了,不过这个程序此时存在三个问题:

问题一:关于路径的分隔符

在windows操作之中,使用“\”作为路径分隔符,而在Linux系统下使用“/”作为路径分隔符,而实际的开发而言,大部分情况下会在windows中做开发,而后将项目部署在Linus,那么此时,路径的分隔符都需要进行修改,这样实在是国语麻烦,为此在File类之中提供了一个常量:public static final String separator(按照Java的命名规范来讲,对于全局常量应该使用大写字母的方式定义,而此处使用的是小写,是由Java的发展历史所带来的问题)。

//由不同的操作系统的JVM来决定最终的separator是什么内容
File file = new File("f:" + File.separator + "hello.txt");  

问题二:是有可能会出现的延迟问题

发现程序执行完成之后,对于文件的创建或者是删除是会存在一些操作上的延迟,如果现在假设先删除了一个文件,而后立刻判断此文件是否存在,那么可能得到的结果就是错误的(为true),一位所有的*.class文件都要通过JVM与操作系统间接操作,这样就有可能会出现延迟的问题。

image-20210818141728897

问题三:目录问题

之前进行文件创建的时候都是在根目录下创建完成的,如果说现在要创建的文件有目录呢?例如,现在要创建一个f:\hello\hello.txt文件,而此时在执行程序的时候hello目录不存在,这个时候执行的话就会出现错误提示:

Exception in thread "main" java.io.IOException: 系统找不到指定的路径。

因为现在目录不存在,所以不能创建,那么这个时候必须首先判断要创建文件的父路径是否存在,如果不存在应该创建一个目录,之后再进行文件的创建,而要想完成这样的操作,需要一下几个方法支持:

找到一个指定文件的父路径:public File getParentFile();

创建目录:public boolean mldirs()。

package com.day14.demo;
​
import java.io.File;
import java.io.IOException;
​
public class FileDemo {
    public static void main(String[] args) throws IOException {
        //由不同的操作系统的JVM来决定最终的separator是什么内容
        File file = new File("f:" + File.separator +"hello" + File.separator + "hello.txt");    
        if(!file.getParentFile().exists()){//父目录
            file.getParentFile().mkdirs();//创建父目录
        }
        if(file.exists()){//文件存在
            file.delete();
        }else{//文件不存在
            file.createNewFile();//创建文件
        }
    }
}

以后在任何的java.io.File类开发过程之中,都一定要考虑文件目录的问题。

2、取得文件信息

在File类之中还可以通过以下的方法取得一些文件的基本信息:

方法名称 描述
public String getName() 取得文件的名称
public boolean isDirectory() 给定的路径是否为文件夹
public boolean isFile() 给定的路径是否是文件
public boolean isHidden() 是否是隐藏文件
public long lastModified() 文件的最后一次修改日期
public long length() 取得文件大小,是以字节为单位返回的。

获取文件的大小信息以及核心信息

package com.day14.demo;
​
import java.io.File;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
class MyMath{
    public static double round(double num, int scale){
        return Math.round(num * Math.pow(10, scale)) / Math.pow(10, scale);
    }
}
public class FileDemo2 {
    public static void main(String[] args) {
        File file = new File("f:" + File.separator + "701_03_支付宝沙箱使用.avi");
        if(file.exists() && file.isFile()){
            System.out.println("1文件大小为:" + MyMath.round(file.length() / (double) 1024 / 1024, 2));
            System.out.println("最后一次修改日期:"+ new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date(file.lastModified())));
            System.out.println("2文件大小为:" + new BigDecimal(file.length() / (double)1024 /1024).divide(new BigDecimal(1), 2, BigDecimal.ROUND_HALF_UP).doubleValue());
        }
        
    }
}

列出目录内容:public File [] listFiles(),此方法将目录中的所有文件以File对象数组的方式返回;

列出目录的所有结构

package com.day14.demo;
​
import java.io.File;
import java.util.Arrays;
​
public class FileDemo3 {
    public static void main(String[] args) {
        File file = new File("f:" + File.separator);
        if(file.exists() && file.isDirectory()){
            File[] listFiles = file.listFiles();
            System.out.println(Arrays.toString(listFiles));
        }
    }
}
3、综合案例:目录列表

现在希望把一个目录下的全部文件都列出来,那么这种情况下只能采用递归:因为列出一个目录下的全部文件或着文件夹之后,如果发现列出的内容是文件夹,则应该向后继续列出。

列出指定目录下的所有文件

package com.day14.demo;
​
import java.io.File;
​
public class FileListDemo {
    public static void main(String[] args) {
        File file = new File("f:" + File.separator);
        list(file);
    }
    public static void list(File file){
        if(file.isDirectory()){
            File[] files = file.listFiles();
            if(files != null){
                for (int i = 0; i < files.length; i++) {
                list(files[i]);//继续列出
                }
            }   
        }
        System.out.println(file);
    }
}

线程阻塞问题

现在代码都在main线程下执行,如果该程序执行完成后才能继续执行下一条语句,要想解决这种耗时的问题。最好产生一个新的线程进行列出。

package com.day14.demo;
​
import java.io.File;
​
public class FileListDemo {
    public static void main(String[] args) {
        new Thread(()->{
            File file = new File("f:" + File.separator);
        list(file);
        },"列出线程").start();
        
        System.out.println("开始进行文件信息列出。。。。");
    }
    public static void list(File file){
        if(file.isDirectory()){
            File[] files = file.listFiles();
            if(files != null){
                for (int i = 0; i < files.length; i++) {
                list(files[i]);//继续列出
                }
            }   
        }
        System.out.println(file);
    }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。