【JavaEE】文件操作与IO

news2024/10/6 10:40:50

作者主页:paper jie_博客

本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。

本文于《JavaEE》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将基础知识一网打尽,希望可以帮到读者们哦。

其他专栏:《MySQL》《C语言》《javaSE》《数据结构》等

内容分享:本期将会分享文件操作与IO的集合类芝士

目录

认识文件

文件的结构组织和目录

文件路径

 二进制文件与文本文件

 Java中操作文件

File概述

 属性

构造方法

方法

文件的读写 - 数据流

InputStre

FileInputStream

OutputStream

FIleOutputStream

 Scanner

小程序练习

扫描指定目录,找到指定文件

文件复制

扫描指定目录,通过文件内容来寻找指定文件 


认识文件

针对硬盘这种持久化存储的IO存储设备,当我们想要进行数据保存的时候,往往不是一个整体,而是独立成一个一个的单位来存储.这个独立的单位被抽象成文件的概念.文件除了有数据内容外,还有一部分信息,比如:文件名,文件类型,文件大小等并不作为文件的数据而存在,这部分信息称为文件的元信息.

文件的结构组织和目录

随着文件数量的增加,文件的系统管理的需要日益迫切.而我们的操作系统的一个板块就有一个专门管理文件 - 文件系统. 有它将硬件细节封装起来,提供统一的API供我们使用.而此处的文件系统就是按照树型结构来组织文件的.这就是我们平时锁的文件夹或者目录的概念.

文件路径

如何在文件系统中定位到我们的一个唯一的文件就需要使用到我们的路径.路径我们可以从树的角度出发,树的每一个节点都可以被一条从根开始,一直到达叶子节点的路径锁描述.这就是一个文件的绝对路径.

除了可以从根结点开始描述路径我们也可以从任意结点出发,进行路径的描述,而这种描述方式就是相对路径.就是对于当前所在结点的一条路径.

这里:
. 代表当前路径

.. 代表当前路径上的前一个路径

 

 二进制文件与文本文件

文件中,根据其保存的数据不同,也经常被分为不同的类型.我们一般分为文本文件和二进制文件,分别指保存字符集编码的文本和按照标准格式的非被字符集编码过的文件.

这里有一个简单区别他们的方式: 看的懂的文件就是文本文件,看不懂的文件就是二进制文件.

在Windows操作系统上,会按照文件名中的后缀来确定文件类型以及该文件的的默认打开程序.但是这个习俗并不通用.在一些其他系统上比如OSX,Unix,Linux等就没有这种的习惯,一般不会对文件类型做这么精确的分类.

文件由于被操作系统进行了管理,所以根据不同的用户,会赋予用户不同的对待该文件的权限,一般地可以认为有可读,可写,可执行权限.

 Java中操作文件

在Java中通过java.io.File类来对一个文件和目录就进行描述.注意,有File对象,并不代表真实存在该文件.

File概述

 属性

修饰符及类型属性说明
static StringpathSeparator依赖于系统的路径分隔符,String
类型的表⽰
static charpathSeparator依赖于系统的路径分隔符,char 类
型的表⽰

构造方法

签名说明
File(File parent, String child)根据⽗⽬录 + 孩⼦⽂件路径,创建⼀个新的 File 实例
File(String pathname)根据⽂件路径创建⼀个新的 File 实例,路径可以是绝
对路径或者相对路径
File(String parent, String child)根据⽗⽬录 + 孩⼦⽂件路径,创建⼀个新的 File 实
例,⽗⽬录⽤路径表⽰ 

方法

返回类型方法签名说明
StringgetParent()返回File对象的父目录文件路径
StringgetName()返回FIle对象的存文件名称
StringgetPath()返回File对象的文件路径
StringgetAbsolutePath()返回File对象的绝对路径
StringgetCanonicalPath()返回FIle对象修饰过的绝对路径
booleanexists()判断File对象描述的文件是否真实存在
booleanisDirectory()判断File对象代表的文件是否是一个目录
booleancreateNewFile()根据File对象,自动创建一个空文件.成功创建后返回true
booleandelete()根据File对象,删除文件.成功后返回true
voiddeleteOnExit()根据File对象,标注文件将被删除,删除动作会到JVM运行结束后才会进行
String[]list()返回File对象代表的目录下所有的文件名和子目录
File[]listFiles()

返回File对象代表的目录下的所有文件和子目录,以File对象表示

booleanmkdir()创建FIle对象代表的目录
booleanmkdirs()创建爱你File对象代表的目录,如果必要,会创建中间目录
booleanrenameTo(File dest)进行文件改名,可以理解为剪切,粘贴操作
booleancanRead()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限

实例一:

public class IODemo1 {
    public static void main(String[] args) throws IOException {
        File file = new File("./test.txt");
        System.out.println(file.getParent());
        System.out.println(file.getName());
        System.out.println(file.getPath());
        System.out.println(file.getAbsolutePath());
        System.out.println(file.getCanonicalPath());
    }
}

实例二:

public class IODemo2 {
    public static void main(String[] args) throws IOException {
        File file = new File("./test.txt");
        System.out.println(file.exists());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
        System.out.println(file.createNewFile()); 
        System.out.println(file.delete());
    }
}

实例三:

public class IODemo3 {
    public static void main(String[] args) throws InterruptedException {
        File file = new File("./test.txt");
         file.deleteOnExit();
         Thread.sleep(5000);
    }
}

实例四:

public class IODemo {
    public static void main(String[] args) {
        File file = new File(".");
        String[] str = file.list();
        System.out.println(Arrays.toString(str));
        File[] files = file.listFiles();
        System.out.println(Arrays.toString(files));
    }
}

实例五:

public class IODemo4 {
    public static void main(String[] args) {
        File file = new File("./test.txt");
        File file2 = new File("./test2.txt");
//        file.mkdir();
//        file.mkdirs();
        file.renameTo(file2);
    }
}

文件的读写 - 数据流

InputStre

修饰符及返回值类型⽅法签名说明
intread()读取⼀个字节的数据,返回-1代表
已经完全读完了
intread(byte[] b)最多读取 b.length 字节的数据到 b
中,返回实际读到的数量;-1 代表
以及读完了
intread(byte[] b,int off, int len)最多读取 len - off 字节的数据到 b 
中,放在从 off 开始,返回实际读
到的数量;-1 代表以及读完了
voidclose()关闭字节流 

InputStream只是一个抽象类,要使用还需要具体的实现类.关于InputStream的实现类有很多,基本可以认为不同的输入设备都可以对应一个InputStream类,我们现在只关心从文件中读取,所以使用FileInputStream.

FileInputStream

签名说明
FileInputStream(File file)利⽤ File 构造⽂件输⼊流
FileInputStream(String name)利⽤⽂件路径构造⽂件输⼊流
public class IODemo5 {
    public static void main(String[] args) {
        try(InputStream inputStream = new FileInputStream("test2.txt")) {
            while(true) {
                //read()
                /*int n = inputStream.read();
                if(n == -1) {
                    return;
                }
                System.out.printf("%c", n);*/
                //read(byte[])
                byte[] buffer = new byte[1024];
                int n = inputStream.read(buffer);
                if(n == -1) {
                    return;
                }
                System.out.println(Arrays.toString(buffer));
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

OutputStream

修饰符及返回值类型⽅法签名说明
voidwrite(int b)写⼊要给字节的数据
voidwrite(byte[] b)将 b 这个字符数组中的数据全部写
⼊os中
intwrite(byte[] b, int off, int len)将 b 这个字符数组中从 off 开始的
数据写⼊ os 中,⼀共写 len 个
voidclose()关闭字节流
voidflush()重要:我们知道 I/O 的速度是很慢
的,所以,⼤多的 OutputStream
为了减少设备操作的次数,在写数
据的时候都会将数据先暂时写⼊内
存的⼀个指定区域⾥,直到该区域
满了或者其他指定条件时才真正将
数据写⼊设备中,这个区域⼀般称
为缓冲区。但造成⼀个结果,就是
我们写的数据,很可能会遗留⼀部
分在缓冲区中。需要在最后或者合
适的位置,调⽤flush(刷新)操
作,将数据刷到设备中。

OutputStream同样是一个抽象类,要使用还需要具体的实现类.我们现在还是只关心写入文件中,所以使用FileoutputStream

FIleOutputStream

实例:

public class IODemo6 {
    public static void main(String[] args) {
        try(OutputStream outputStream = new FileOutputStream("test2.txt")) {
            byte[] buffer = new byte[]{12,65,76,78,90,89};
            outputStream.write(buffer);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

 Scanner

Scanner这个类也可以帮助我们进行字符读取

实例:

public class IODemo7 {
    public static void main(String[] args) {
        try(InputStream inputStream = new FileInputStream("test2.txt")) {
            Scanner scanner = new Scanner(inputStream);
            while(scanner.hasNext()) {
                String s = scanner.next();
                System.out.println(s);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

小程序练习

扫描指定目录,找到指定文件路径

import java.io.File;
import java.util.Scanner;
public class IODemo1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要扫描的目录: ");
        String rootPath = scanner.next();
        System.out.println("请输入你要查找的文件: ");
        String fileName = scanner.next();
        File file = new File(rootPath);
        if(!file.isDirectory()) {
            System.out.println("输入的目录不合法");
            return;
        }
        scanDir(file, fileName);

    }

    private static void scanDir(File file, String fileName) {
        File[] files = file.listFiles();
        if(files == null) {
            return;
        }
        for(File f : files) {
            System.out.println("遍历到: " + f.getAbsolutePath());
            //如果是普通文件
            if(f.isFile()) {
                if(fileName.equals(f.getName())) {
                    System.out.println("需要查找的文件路径: " + f.getAbsolutePath());
                }
                //如果是子目录
            }else if(f.isDirectory()) {
                scanDir(f, fileName);
            }else {
                ;
            }
        }

    }
}

文件复制

import java.io.*;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: sun杰
 * Date: 2024-01-19
 * Time: 15:43
 */
public class IODemo3 {
    public static void main(String[] args) {
         Scanner scanner = new Scanner(System.in);
        System.out.println("请输入源文件");
        String srcPath = scanner.next();
        File srcfile = new File(srcPath);
        if(!srcfile.isFile()) {
            System.out.println("你输入的路径不合法");
            return;
        }
        System.out.println("请输入目标文件");
        String destPath = scanner.next();
        File destfile = new File(destPath);
        if(!destfile.getParentFile().isDirectory()) {
            System.out.println("你输入的路径不合法");
            return;
        }
        try(InputStream inputStream = new FileInputStream(srcfile);
            OutputStream outputStream = new FileOutputStream(destfile)) {
            while(true) {
                //将源文件的内容读取到Buffer数组中
                byte[] buffer = new byte[1024];
                int n = inputStream.read(buffer);
                if(n == -1) {
                    break;
                }
                //将读到的内容写到目标文件中
                outputStream.write(buffer, 0 , n);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

扫描指定目录,通过文件内容来寻找指定文件 

import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
import java.util.zip.InflaterOutputStream;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: sun杰
 * Date: 2024-01-19
 * Time: 16:08
 */
public class IODemo4 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要扫描的目录: ");
        String fileName = scanner.next();
        System.out.println("请输入需要查找的词");
        String word = scanner.next();
        File rootFile = new File(fileName);
        if(!rootFile.isDirectory()) {
            System.out.println("你输入的路径不合法");
            return;
        }

        scanDir(rootFile, word);
    }
    public static void scanDir(File rootFile, String word) {
        File[] files = rootFile.listFiles();
        if(files == null) {
            return;
        }
        for(File f : files) {
            if(f.isFile()) {
                searcewordFile(f, word);
            }else if(f.isDirectory()) {
                scanDir(f, word);
            }else {
                ;
            }
        }
    }

    private static void searcewordFile(File f, String word) {
        try(InputStream inputStream = new FileInputStream(f)) {
            StringBuilder stringBuilder = new StringBuilder();
            while(true) {
                byte[] buffer = new byte[1024];
                int n = inputStream.read(buffer);
                if(n == -1) {
                    break;
                }
                String s = new String(buffer, 0, n);
                stringBuilder.append(s);
            }
            if(stringBuilder.indexOf(word) == -1) {
                return;
            }
            System.out.println("找到了,路径为: " + f.getAbsolutePath());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

                

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

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

相关文章

vue3+vite:封装Svg组件

前言 在项目开发过程中,以svg图片引入时,会遇到当hover态时图片颜色修改的场景,我们可能需要去引入另一张不同颜色的svg图片,或者用css方式修改,为了方便这种情况,需要封装svg组件来自定义宽高和颜色&…

IaC基础设施即代码:Terraform 进行 lifecycle 生命周期管理

目录 一、实验 1.环境 2.Terraform 创建网络资源 3.Terraform 进行 create_before_destroy(销毁前创建新资源) 4.Terraform 进行 prevent_destroy(防止资源被销毁) 5.Terraform 进行 ignore_changes(忽略资源的差…

记录汇川:H5U与Factory IO测试15

主程序: 子程序: IO映射 子程序: 出料程序 子程序: 视觉判断 子程序: 自动程序 Factory IO配置: 实际动作如下: Factory IO测试15

【本科生机器学习】【北京航空航天大学】课题报告:支持向量机(Support Vector Machine, SVM)初步研究【上、原理部分】

说明: (1)、仅供个人学习使用; (2)、本科生学术水平有限,故不能保证全无科学性错误,本文仅作为该领域的学习参考。 一、课程总结 1、机器学习(Machine Learning, ML&am…

【Docker】安装 Nacos容器并根据Nginx实现负载均衡

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Docker实战》。🎯🎯 &…

Go使用记忆化搜索的套路【以20240121力扣每日一题为例】

题目 分析 这道题很明显记忆化搜索,用py很容易写出来 Python class Solution:def splitArray(self, nums: List[int], k: int) -> int:n len(nums)# 寻找分割子数组中和的最小的最大值s [0]for num in nums:s.append(s[-1] num)#print(s)cachedef dfs(cur,…

跟着pink老师前端入门教程-day07

去掉li前面的项目符号(小圆点) 语法:list-style: none; 十五、圆角边框 在CSS3中,新增了圆角边框样式,这样盒子就可以变成圆角 border-radius属性用于设置元素的外边框圆角 语法:border-radius:length…

1.11马原

同一性是事物存在和发展的前提,一方的发展以另一方的发展为条件 同一性使矛盾双方相互吸收有利于自身的因素,在相互作用中各自得到发展 是事物发展根本规律,唯物辩证法的实质和核心 揭示了事物普遍联系的根本内容和变化发展的内在动力 是贯…

Vue3 在 history 模式下通过 vite 打包部署白屏

Vue3 在 history 模式下通过 vite 打包部署后白屏; 起因 hash 模式 url 后面跟个 # 强迫症犯了改成了 history,就此一波拉锯战开始了 ... 期间 nigix 和 router 各种反复排查尝试最终一波三折后可算是成功了 ... Vue官方文档 具体配置可供参考如下: 先简要介绍下,当前项目打包…

SpringBoot整合Dubbo和Zookeeper分布式服务框架使用的入门项目实例

文章目录 SpringBoot整合Dubbo和Zookeeper分布式服务框架使用的入门项目实例Dubbo定义其核心部分包含: 工作原理为什么要用dubbo各个节点角色说明:调用关系说明: dubbo为什么需要和zookeeper结合使用,zookeeper在dubbo体系中起到什么作用&…

0基础开发EtherNet/IP:协议格式,JAVA、C#、C++处理

经过一阵倒腾,把CIP、Ethernet/ip协议搞到手 协议的概念和理论就不提及了,上网随便一搜索EtherNet/IP遍地都是。 直接将协议关键点列举出来吧。 更多协议资料 www.jngbus.com 通讯软件群 30806722 这里讲解的是TCP和UDP协议的格式,EtherN…

【标准IO】fseek函数、ftell函数、fflush函数、getline函数

目录 fseekftellrewindfflushgetline 橙色 当你在文件中写入了10个字符后,又想把这10个字符读出来,该怎么做呢?因为有文件操作符指针的存在,此时该指针已经指在了这10个字符末尾,所以需要把该指针重定向,这…

RT-Thread Studio学习(十七)虚拟串口

RT-Thread Studio学习(十七)虚拟串口 一、简介二、新建RT-Thread项目并使用外部时钟三、启用USB设备功能四、测试 一、简介 本文将基于STM32F407VET芯片介绍如何在RT-Thread Studio开发环境下实现USB虚拟串口。 硬件及开发环境如下: OS WI…

油管公式(全)

原文:The Youtube Formula 译者:飞龙 协议:CC BY-NC-SA 4.0 前言 每个人都应该有一个 YouTube 频道。真的每个人,尤其是品牌。当我看到没有在 YouTube 上存在的品牌时,我觉得他们疯了。任何人都不利用这个机会是难以想…

python-基础篇-变量

文章目录 变量的基本使用目标01. 变量定义1) 变量演练1 —— iPython2) 变量演练 2 —— PyCharm3) 变量演练 3 —— 超市买苹果思考题 02. 变量的类型2.1 变量类型的演练 —— 个人信息2.2 变量的类型2.3 不同类型变量之间的计算1) **数字型变量** 之间可以直接计算2) **字符串…

从零开始:直播电商APP开发全流程解析

本篇文章,小编将从零开始,全面解析直播电商APP的开发流程,涵盖了关键的技术要点和开发阶段的关键步骤。 第一阶段:需求分析与规划 此阶段的关键任务包括: 1.用户需求调研 2.功能规划 3.技术选型 第二阶段&#xf…

安卓平板局域网内远程控制工控机方法

安卓平板局域网内远程控制工控机方法 将所需要远程控制的工控机通过网线连接到具有WiFi功能的路由器上,将安卓平板连接上WiFi,如下图所示 下载NoMachine远程软件安装包,官网地址:https://www.nomachine.com/ 点击Download now按钮…

图论:最短路(dijkstra算法、bellman算法、spfa算法、floyd算法)详细版

终于是学完了,这个最短路我学了好几天,当然也学了别的算法啦,也是非常的累啊。 话不多说下面看看最短路问题吧。 最短路问题是有向图,要求的是图中一个点到起点的距离,其中我们要输入点和点之间的距离,来求…

【Docker】安装Nginx容器并部署前后端分离项目

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Docker实战》。🎯🎯 &…

代码随想录算法训练营第十一天|● 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150. 逆波兰表达式求值

文章目录 20.有效的括号思路:代码: 1047. 删除字符串中的所有相邻重复项思路代码1:栈储存代码2:双指针 150. 逆波兰表达式求值思路:题外话代码 20.有效的括号 思路: 由于栈结构的特殊性,非常适合做对称匹配…