Java:文件IO

news2024/9/21 16:30:13

JavaEE16

一、文件系统操作

  在java标准库中,实现了File类,其中提供了文件操作的方法!

1、构造方法:

方法名说明

File(File parent , String child)

根据父目录+孩子文件路径,创建一个新的File 实例
File( String pathname)根据文件路径创建一个新的File的实例,路径可以是绝对路径或者相对路径
File( String parent, String child)根据父目录+孩子文件路径,创建一个新的File实例,父目录用路径表示

2、与文件路径有关的方法:

返回类型方法名说明
StringgetParent( )返回File对象的父目录文件路径
String

getName( )

返回File对象的纯文件名称
StringgetPath( )返回File对象的文件路径
StringgetAbsolutePath( )返回File对象的绝对路径
StringgetCanonicalPath( )返回File对象的修饰过程的绝对路径

 代码案例一:绝对路径创建法

代码案例二:相对路径创建法(基准目录是当前IDEA所打开文件的所在目录)

3、文件判断方法

返回值方法名说明
bolleanexists( )判断File对象所描述的文件是否真实存在
booleanisDirectory( )判断File对象代表的文件是否是一个目录
booleanisFile()判断File对象所代表的文件是否是一个普通文件
booleancreateNewFile( )根据File对象,自动创建一个空文件,创建成功返回true
booleandelete( )删除File对象所描述的文件,删除成功返回true

代码案例一:文件不存在的情况

代码案例二: 文件存在的情况

同时,在该文件目录下,也会创建对应的txt文件

删除文件 

 

其实,还有另外一种删除操作,deleteOnExit(),当进程结束时,才真的执行删除操作!应用场景是可以创建一些临时文件!

4、与文件目录有关的方法

返回值方法名说明
String[ ]list( )返回File对象代表的目录下的所有文件名
File[ ]listFiles( )返回File对象代表的目录下的所有文件,以File对象表示

代码案例1:(打印目录中第一层的文件路径)

代码案例2:递归打印目录下所有文件路径 

//递归打印所有文件路径
public class Demo5 {
    public static void scan(File current){
        //判断current是否为目录
        if(!current.isDirectory()){
            return;
        }

        //此时表示是current是目录
        File[] files=current.listFiles();
        if(files==null||files.length==0){
            return;
        }

        //此时表示该目录存在
        for(File f:files){
            if(f.isFile()){
                System.out.println(f.getAbsolutePath());
            }else{
                scan(f);
            }
        }



    }
    public static void main(String[] args) {
        File f=new File(".");
        scan(f);
    }
}

5、创建目录

代码案例一:创建普通目录

2、代码案例二:创建多层目录

6、重命名文件(移动文件)

代码案例一:修改文件名

代码案例二:修改文件级别

任务:将efg文件的级别设置为和hhh文件同级

二、文件内容操作

1、IO流

  文件操作内容包括:读文件 和 写文件,都是操作系统提供的api,java也进行了封装!要学习文件内容的操作,离不开对“文件流”的了解!

  文件流就像水流一样,不过它流动的是数据,它也叫IO流。

  IO流主要分为两个大类:

1)字节流(二进制): 读写数据的基本单位,就是字节。(InputStream、OutputStream)

2)字符流(文本):读写数据的基本单位,就是字符.(Reader、Writer)

 2、文件的打开和关闭

  在对文件内容进行操作的时候,首先需要打开文件。打开文件,其实是在该进程的 文件描述符表 中创建了一个新的表项!

  文件描述符表,可以理解为一个数组,数组的每个元素就是一个struct file对象,每个结构体就描述了对应操作的文件信息。数组的下标,就称为“文件描述符”。

  每次打开一个文件,就相当于在数组上占用了一个位置,而在系统内核中,文件描述符表数组,是固定长度,不可扩容的!除非主动close文件,才能释放空间!如果代码里一直打开文件,不去关闭,就会使这里的空间越来越小,等数组搞满了,后续打开文件就会失败!

JavaEE17

3、读文件

方法一:

public static void main(String[] args) throws IOException {

        //try括号里面文件在try语句结束时会自动关闭
        try (InputStream inputStream = new FileInputStream("./text.txt")){//可以传入路径或file对象
            while(true){
                //当read返回值为-1,表示文件读取结束
                int b=inputStream.read();
                if(b==-1){
                    break;
                }
                System.out.printf("0x%x\n",b);

            }

        }catch (IOException e) {
            e.printStackTrace();
        }

    }

   缺点:频繁进行IO操作,开销大!

方法二:

public class Demo6 {
    public static void main(String[] args) throws IOException {

        //try括号里面文件在try语句结束时会自动关闭
        try (InputStream inputStream = new FileInputStream("./text.txt")){//可以传入路径或file对象
            //一次IO操作,该操作把在硬盘上读取的数据,填充到buffer内存中
            byte[] buffer=new byte[1024];
            int n= inputStream.read(buffer);//返回成读取的字节数
            System.out.println(n);

        }catch (IOException e) {
            e.printStackTrace();
        }

    }

}

4、写文件

代码案例一:

注意:一旦使用outputStream打开文件,会清空原文件的内容!

代码案例二:追加模式

  如果不想清空原文件的内容,可以开启outputStream的追加的模式 

代码案例三:一次写入多个字节

5、字符流读文件

  在utf8编码,每个汉字是3个字节,当使用字符流读取数据的时候,就会自动切换编码方式为unicode编码,此时每个汉字是两个字节!

6、字符流写文件

 

一、文件操作实践

案例一:删除文件名包含关键字的文件 

public class Demo8 {
    private static void doSomething(File f,String key) {
        //如果包含关键字,让用户决定要不要删除
        if (f.getName().contains(key)) {
            System.out.println("是否要删除文件"+f.getName()+"删除Y,不删除N");
            Scanner scanner = new Scanner(System.in);
            String choice = scanner.next();
            if(choice.equals("Y")||choice.equals("y")){
                f.delete();
                System.out.println("删除文件成功");
            }else if(choice.equals("N")||choice.equals("n")){
                System.out.println("不删除该文件");
            }else{
                System.out.println("输入有误,重新输入");
                doSomething(f,key);

            }
        }

    }
    private static void scan(File file,String key){
        //如果不是目录,结束该方法
        if(!file.isDirectory()){
            return;
        }
        //如果目录下没有文件,结束该方法
        File[] list=file.listFiles();
        if(list==null||list.length==0){
            return;
        }

        for(File f:list){
            if(f.isFile()){
                doSomething(f,key);
            }else{
                scan(f,key);
            }
        }
    }
    //删除文件名含有关键字的文件
    public static void main(String[] args) {
        //1、输入文件路径
        System.out.println("请输入文件路径");
        Scanner scanner=new Scanner(System.in);
        String rootPath=scanner.next();
        //2、打开文件并开始递归遍历文件
        File file=new File(rootPath);
        //输入关键字
        System.out.println("请输入关键字");
        String key=scanner.next();
        scan(file,key);

    }

}

案例二:复制文件

  注意:复制的时候,如果目录中文件不存在,会自动创建文件,但是如果目录不存在,那么无法自动创建目录!

public class Demo8 {
    //复制文件
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入源文件的文件路径");
        String src=scanner.next();
        File srcFile=new File(src);
        if(!srcFile.isFile()){
            System.out.println("源文件路径有误!");
            return;
        }

        System.out.println("请输入目标文件的路径");
        String dest=scanner.next();
        File destFile=new File(dest);
        if(!destFile.getParentFile().isDirectory()){
            System.out.println("目标父目录有误!");
            return;
        }

        try(InputStream inputStream=new FileInputStream(srcFile);
            OutputStream outputStream=new FileOutputStream(destFile)) {
            while (true) {
                byte[] buffer = new byte[1024];
                int n =inputStream.read(buffer);//读完放buffer里面
                if(n==-1){
                    break;
                }
                outputStream.write(buffer,0,n);
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

案例三:按照内容查找文件

public class Demo9 {
    private static void doSearch(File file,String key)  {
        StringBuilder stringBuilder=new StringBuilder();
            try(Reader reader=new FileReader(file)){
                while(true) {
                    char[] buffer = new char[1024];
                    int n=reader.read(buffer);
                    if(n==-1){
                        break;
                    }
                    String s=new String(buffer,0,n);
                    stringBuilder.append(s);
                }
                if(stringBuilder.indexOf(key)==-1){
                    System.out.println("该文件不是目标文件");
                }else{
                    System.out.println("找到目标文件"+file.getAbsolutePath());
                }
            }catch (IOException e){
                e.printStackTrace();
            }


    }


    private static void scan(File file,String key){
        if(!file.isDirectory()){
            return;
        }

        File[] list=file.listFiles();
        if(list==null||list.length==0){
            return;
        }

        for(File f:list){
            if(f.isFile()){
                doSearch(f,key);
            }else{
                scan(f,key);
            }
        }
    }


    //查找某个目录底下所有内容包含关键字的文件
    public static void main(String[] args) {
        //1、输入文件路径
        System.out.println("请输入文件路径");
        Scanner scanner=new Scanner(System.in);
        String rootPath=scanner.next();
        //2、创建文件对象并且判断是否为文件目录
        File file=new File(rootPath);
        if(!file.isDirectory()){
            //该路径不是目录
            System.out.println("文件路径有误!");
            return;
        }
        //3、该文件是路径,开始查找
        System.out.println("输入关键字");
        String key=scanner.next();
        scan(file,key);



    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038055.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

dockers 阿里云镜像失效后如何配置,可视化操作

Windows 环境 Client:Version: 24.0.6Context: defaultDebug Mode: false方法一 docker-desktop 配置方式 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,…

【echarts】甘特图

const milestones [{ progress: 100, milestoneName: 阶段一, startDate: 2020-12-23, endDate: 2021-01-30 },{ progress: 100, milestoneName: 阶段二, startDate: 2021-01-15, endDate: 2021-03-15 },{ progress: 100, milestoneName: 阶段三, startDate: 2021-03-10, endD…

ubuntu 24.04执行apt-get update报错处理

文章目录 一、apt-get update报错内容二、解决启动失败的服务推荐阅读 今天在做Ubuntu 24.04更新时,突然跳出两个报错,这在之前还从未遇到过,处理过程记录和分享一下: 一、apt-get update报错内容 报错截图参考如下: …

现货黄金美盘开盘时间是什么呢

现货黄金的开盘时间会因为地区和平台而有所差异,一般来说,香港的平台在北京时间周一早间7点左右会开盘,并一直持续周六凌晨才收盘,周六和周日是市场的休市时间,期间交易平台一般会关闭,无法进行交易&#x…

一文读懂什么是进销存!进销存有何价值作用?

企业在运营过程中,常常会遇到诸如库存不准确、采购计划混乱、销售数据跟踪困难等问题,这些问题不仅影响了企业的日常运营,还可能导致客户满意度下降、利润受损。而一个合适的进销存系统,就像是一把钥匙,可以帮助企业打…

MySQL基础练习题34-游戏玩法分析4

目录 题目 准备数据 分析数据 总结 题目 报告在首次登录的第二天再次登录的玩家的 比率,四舍五入到小数点后两位。换句话说,你需要计算从首次登录日期开始至少连续两天登录的玩家的数量,然后除以玩家总数。 准备数据 ## 创建库 create…

为什么要学医疗器械维修?

在当今高速发展的医疗领域,医疗器械维修已成为一个极具吸引力和潜力的职业选择。那么,为什么要学习医疗器械维修呢? 一、稳定且持续增长的需求 随着医疗技术的不断进步,医疗器械的种类和数量日益增多。从常见的 X 光机、CT 扫描仪…

新专利:温室土壤温湿度预测模型构建方法和程序产品

( 于景鑫 国家农业信息化工程技术研究中心)在现代设施农业生产中,温室微环境的精准调控是提高作物产量和品质的关键。然而,由于温室内外环境因素的复杂多变,尤其是土壤温湿度的非线性、非平稳特性,传统的预…

【vue3|第23期】Vite + Vue3: 深入理解public和assets文件夹的作用与使用

日期:2024年8月14日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#xf…

如果让你消息队列,该如何设计?说一下你的思路

在当今的分布式系统中,消息队列是一个不可或缺的组件,它在系统解耦、流量削峰、异步处理等方面发挥着重要作用。 如果我要设计一个消息队列,我会从以下几个关键点出发呢? 让我们来探讨一下如何设计一个消息队列的架构。 实现内存…

【MySQL】数据库初识

文章目录 前言一、MySQL的基本结构二、MySQL的组成三、数据库的简单使用数据库操作数据类型认知数值类型字符串类型日期类型 数据库表操作 总结 前言 数据库是一类软件,有MySQL、Oracle、SQL Server、Redis等作为代表,通过数据库能够对数据进行管理和组…

六大热门及两个趋冷的网络安全趋势

AI不仅在改变威胁环境,还在改变安全团队保护其组织的方式,然而,AI并不是网络安全专业人士应该关注的唯一趋势。 在网络安全领域,与其他领域一样,AI和GenAI都是人们关注的焦点,恶意行为者正在利用AI和GenAI创造更具隐蔽性的恶意软件、更具说服力的钓鱼邮件以及更逼真的深…

DevExpress开发WPF应用实现对话框总结:编织界面的艺术之旅

在软件开发的浩瀚星空中,WPF(Windows Presentation Foundation)以其卓越的界面表现力和丰富的控件库,成为了众多开发者心中的璀璨明珠。而DevExpress,作为WPF领域的佼佼者,更是以其强大的组件库和易于集成的…

大模型时代来临:程序员如何自处,产品经理如何迎接新挑战

一名失业中的程序员,因为一次大胆的求职之举登上了微博热搜。 向瑶函花费999元,在广州地铁珠江新城站购买了一个广告位5天的使用权,用来投放自己的简历二维码,扫码就可以了解这名程序员“飘零的前半生”。 向瑶函是在2023年5月“…

灵巧守门员——代理模式(Java实现)

代理模式不仅在控制对象访问上展现了其独特的优势,还在功能扩展和系统安全性上起到了重要作用。上期我们介绍了代理模式在Python中的实现,今天,我们将继续探讨代理模式,并展示如何在Java中实现它。 什么是代理模式? …

How do you implement OpenAI GPT-3 Api Client in PHP?

题意:如何在 PHP 中实现 OpenAI GPT-3 API 客户端? 问题背景: I need help understanding the vague instructions on https://packagist.org/packages/orhanerday/open-ai 我需要帮助来理解这些模糊的说明... I downloaded the package fr…

PDF转图片新潮流,4款神器告别手动截图

在这个信息爆炸的时代,PDF文件因为能在各种设备上保持格式不变,成了我们学习和工作中的好帮手。今天,我就诚心诚意地给你推荐几款现在特别流行的PDF转图片工具。这些工具操作起来非常简单,转换速度快,而且转换出来的图…

前端工程化工具——plop的使用-生成模板页面

背景 软件列表 软件名称版本号备注vue3.2.13vue-cli5.0.8plop4.0.1 操作步骤 新建vue3工程 vue create test-plop按提示完成操作即可 modules安装工具选择&#xff1a;yarn或npm均可 安装plop模块 yarn add plop -g新建模板文件 page1/index.hbs <template><…

【启动centos报错】另一个程序已锁定文件的一部分,进程无法访问,打不开磁盘.

启动centos报错 另一个程序已锁定文件的一部分&#xff0c;进程无法访问打不开磁盘“D:\Program2\CentOS\CentOS7\CentOS7.vmdk”或它所依赖的某个快照磁盘。模块“Disk”启动失败。未能启动虚拟机。解决方法 删除.lck文件

基于InP的通用光子集成技术(四)

7.ASPIC设计环境 在光子学中引入通用晶圆方法将导致光子芯片复杂度的重大变化&#xff1a;它将把设计从器件级转移到光路级&#xff0c;这一转变发生在20世纪70年代和80年代的微电子中&#xff0c;现在也发生在PIC中。 在通用方法中&#xff0c;可以通过具有许多构建块的PDK访…