Java中的I/O讲解(超容易理解)(中篇)

如果想观看更多Java内容 可上我的个人主页关注我,地址

子逸爱编程-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/a15766649633?spm=1000.2115.3001.5343

使用工具 IntelliJ IDEA Community Edition 2023.1.4

使用语言 Java8 

代码能力快速提升小方法,看完代码自己敲一遍,十分有用 

目录

1.字节流

1.1 字节输出流

1.1.1 字节输出流基类:OutputStream

1.1.2 字节输出流FileOutputStream类 

1.1.3 字节输出流贯穿示例 

1.2 字节输入流

1.2.1 字节输入流基类:InputStream 

1.2.2 字节输入流FileInputStream类

1.2.3 字节输入流贯穿示例 

2.字符流

2.1 字符输出流

2.1.1 字符输出流基类:Writer 

2.1.2 字符输出流FileWriter类 

2.1.3 字符输出流贯穿示例 

2.2 字符输入流

2.2.1 字符输入流基类:Reader

2.2.2 字符输入流FileReader

2.2.3 字符输入流示例

3.字符缓冲流

3.1 字符缓冲流基本概念 

3.2 字符缓冲输出流 

3.2.1 字符缓冲输出流基本概念

3.2.2 字符缓冲输出流贯穿示例

3.3 字符缓冲输入流 

3.3.1 字符缓冲输入流基本概念 

3.3.2 字符缓冲输入流贯穿示例 


 

1.字节流

java.io包中的流按存储单元分类主要有字节流和字符流两大类,两类都具有输入/输出操作。它们各种的基类如下所示,这些基类均为抽象类;

字节流主要操作对时byte类型数据,其基类就是OutputStream类和InputStream类;

1.1 字节输出流

1.1.1 字节输出流基类:OutputStream

OutputStream类为抽象类,必须使用该类的子类进行实例化对象。如果需要操作文件,则使用FileOutputStream实例化。OutputStream类中的主要操作方法如下: 

主要操作方法
    void close()

        关闭输出流;
    void flush()
        刷新缓冲区;
    void write(byte[] b)
        将每个byte数组写入数据流;
    void write(byte[] b,int off,int len)
        将每个指定范围的byte数组写入数据流;
    void write(int b)
        将一个字节数据写入数据流;

1.1.2 字节输出流FileOutputStream类 

在实际应用中,通常使用OutputStream类的FileOutputStream子类想文本文件写入数据,常用的构造方法如下: 

构造方法:

FileOutputStream(File file)

  • 用于创建向指定File对象写数据的文件输出流
  • file:指定目标文件的对象

FileOutputStream(String name)

  • 用于创建向指定路径的文件写数据的文件输出流
  • name:指定目标文件的路径字符串

FileOutputStream(String name,boolean append)

  • 创建一个向指定路径的文件写入数据的文件输出流
  • name:指定目标文件的路径字符串
  • append:表示是否在文件末尾追加数据,若为true则表示可以在文件末尾追加数据

前两种构造方法在向文件写数据时将覆盖文件中原有的内容。另外在使用FileOutputStream类的构造方法创建对象时,如果对应的文件不存在,就会新建一个文件。如果参数file或name表示的文件路径是一个目录(或不存在这个目录),则会抛出FileNotFoundException(无法找到文件异常)。 

1.1.3 字节输出流贯穿示例 

示例代码:

public static void main(String[] args)  {
        OutputStream outputStream= null;
        try {
            //第一步 创建对象,第一个参数是路径,第二个可写可不写,为true的话就可以在末尾继续添加值,false或不写的话就直接覆盖原来的值
            outputStream = new FileOutputStream("./test/test.txt",true);//如果参数中的文件不存在就会自动帮你创建一个,但是盘符不能有误(会发生无法找到文件异常)
            //第二步 创建需要添加的数据
            String str="I Love Java!";
            //第三步 把数据变为字节(因为这个是字节流的)
            byte[] arr=str.getBytes();
            //第四步 使用write方法添加进去,第一个参数是数据源 第二个从第0个字节开始,第三个到最后结束(不加后面两个会打出来很多空格)
            outputStream.write(arr,0,arr.length);
            System.out.println("数据添加成功!");
            outputStream.close();
        } catch (FileNotFoundException e) {
            System.out.println("文件没找到不好意思,请联系管理员");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

执行两次后指定的文本文件中将出现两句I Love Java!

1.2 字节输入流

1.2.1 字节输入流基类:InputStream 

既然可以使用OutputStream类向文件写数据,那么也可以通过InputStream类从文件中读数据。InputStream同样是抽象类,该类中定义的主要方法如下:

常用方法:
    int read()
        读取一个字节数据;
    int read(byte[] b)
        将数据读取到字节数组中;
    int read(byte[] b,int off,int len)
        从输入流中读取最多len长度的字节,将其保存到字节数组中,保存的位置从off开始;
    void close()
        关闭输入流;
    int available()
        返回输入流读取的字节数 ;

1.2.2 字节输入流FileInputStream类

在实际开发中,通常使用InputStream类的FileInputStream子类实现文本文件内容的读取,其常用的构造方法如下所示:

构造方法:
    FileInputStream(File file)

  • 用于创建从指定File对象读取数据的文件输入流
  • file:指定目标文件数据源对象

    FileInputStream(String name)

  • 用于创建从指定路径的文件读取数据的文件输入流
  • name"指定目标文件数据源路径字符串 

1.2.3 字节输入流贯穿示例 

单字节输入流 

示例代码 

public static void main(String[] args) {
        //单字节读取,不可读取中文
        try {
            //第一步 创建对象,取到路径
            InputStream inputStream=new FileInputStream("./test/test.txt");
            //第二步 返回一个int值
            int data=inputStream.read();
            System.out.println("可读取的字节数:"+ inputStream.available());
            while (data!=-1){//如果字节跑完了,它的值就会变成-1
                System.out.print((char)data);//翻译二进制代码
                data=inputStream.read();//返回一个int值,返回-1就表示没有了
            }
            inputStream.close();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

运行结果 

 

多字节输入流

示例代码 

public static void main(String[] args) {
        //多字节读取,可读取中文
        try {
            //第一步 获取路径
            InputStream inputStream=new FileInputStream("./test/test.txt");
            //第二步 搞一个存字节的数组
            byte[] arr=new byte[3];
            //第三部 每次读取3个字节,就是存字节的那个数组长度,然后存到字节数组中
            int data=inputStream.read(arr);
            //第四步 判断代码是否打印完毕,打印完毕就退出循环
            while (data!=-1){
                System.out.print(new String(arr,0,data));//打印格式 new String(字节数组,从哪个下标开始,到哪里结束);new String代表转String类型
                data=inputStream.read(arr);//返回一个int值,返回-1就表示没有了
            }
            inputStream.close();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

运行结果 

 

 一般使用字节输入流来读取二进制文件,不适合文本文件;

2.字符流

在Java中,GBK编码方式一个中文字符占两个字节,但是现在是UTF编码方式,所以一个中文字符占3个字节。如果用字节流处理文本文件,则程序内部需要将字节转换成字符,降低了执行效率,所以当输入和输出文本文件时,尽量使用字符流。Java提供了Writer类和Reader类来操作字符;

2.1 字符输出流

2.1.1 字符输出流基类:Writer 

 Writer类是字符输出流的抽象基类,Writer类中定义的常用方法如下所示:

常用方法
    void write(String str)

        将str字符串中包含的字符输出到输出流中;
    void write(String str,int off,int len)
        奖字符串中从off位置开始、长度为len的字符输出到输出流中;
    void close()
        关闭输出流;
    void flush()
        刷新输出流;

2.1.2 字符输出流FileWriter类 

  • FileWriter类是Writer类常用的子类,使用该类可以以字符为数据处理单元向文本文件中写数据。
  • 创建该子类对象的方法与字节输出流的创建方法差不多 ;

2.1.3 字符输出流贯穿示例 

示例代码 

public static void main(String[] args) {
        //字符输出流示例
        Writer writer = null;
        try {
            //第一步 创建文件
            writer = new FileWriter("./test/Character.txt");
            //第二步 编写输出内容
            writer.write("预测未来的最好办法就是创造未来!");
            //第三步 把缓存中的数据塞给对应输出文件
            writer.flush();
            System.out.println("添加成功!");
        } catch (IOException e) {
            throw new RuntimeException(e);

        } finally {
            try {
                //第四步 关闭连接
                writer.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

 运行该类可以在输出的文本文档中打印"预测未来的最好办法就是创造未来!"; 

在以上代码中,使用了flush()方法清空流。通俗的说,把FileWriter对象比作排水的水管,将数据写入文本文件中的过程类似于将水通过水管抽取到其他容器的过程,如果在抽取的动作结束之后立即关闭水管,那么水管中有可能存在残留的水没有排干净的情况,这时还需要一个外力清空水管中的残留水,这个清空水管的操作,就类似使用flush()方法清空输出流FileWriter,它可以强制将其中残余的数据写入文本文件中,这样,才算完成全部数据的写操作,这时再使用close()方法关闭流。 

2.2 字符输入流

2.2.1 字符输入流基类:Reader

Reader类是字符输入流的基类,它是抽象类,Reader类的常用方法如下:

常用方法
    int read()

从输入流中读取单个字符,返回所读取的字符数据;
    int read(char[] c)
从输入流中最多读取c.length个字符数据并将其存储在字符数组c中,返回实际读取的字符数;
    int read(char[] c,int off,int len)
从输入流中最多读取len个字符数据并将其存储在字符数组c中。
在存入数组c中时,并不是从数组起点开始的,而是从off位置开始的,返回实际读取的字符数 ;

2.2.2 字符输入流FileReader

  • Reader类同样是抽象类,可以使用其子类FileReader创建对象。
  • 创建该子类对象的方法与字节输入流的创建方法差不多 ;

2.2.3 字符输入流示例

示例代码 

public static void main(String[] args) {
        //字符输入流示例
        Reader reader = null;
        try {
            //第一步 获取路径
            reader = new FileReader("./test/Character.txt");
            //第二步 搞一个存字符的数组
            char[] ch=new char[1024];
            //第三部 每次读取1024个字符,就是存字符的那个数组长度,然后存到字符数组中
            int data=reader.read(ch);
            //第四步 判断代码是否打印完毕,打印完毕就退出循环
            while(data>0){
                System.out.println(new String(ch,0,data));
                data=reader.read(ch);//返回一个int值,比0小就表示没有了
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            try {
                //第五步 关闭连接
                reader.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

 运行结果

字符输入流的示例与字节输入流的使用方法十分相似(几乎一模一样); 

3.字符缓冲流

3.1 字符缓冲流基本概念 

前面介绍的IO流全部属于节点流,能够存储介质(如磁盘、文件等)直接进行数据交互。为提供读写数据的执行效率,java.io包提供了缓冲流,缓冲流属于处理流。下面以字符缓冲流为例介绍缓冲流的用法。

使用缓冲字符流就像是一个人本来直接去水龙头下洗头的,有了缓冲之后就像是拿了水桶去把水接满然后再洗头,就是你先存到缓冲区,然后刷新缓冲区时就执行出来(输入流不用刷新缓冲区);

如果缓冲了就得用缓冲的对象来点方法,由于BufferedWriter是Writer的子类,所以可以调用Writer的方法,BufferedReader也是如此。

字符缓冲流就等于给字符流上buff;

3.2 字符缓冲输出流 

3.2.1 字符缓冲输出流基本概念

BufferedWriter类是Writer类的子类,BufferedWriter类可以把一批数据写到缓冲区,默认情况下,只有在缓冲区满的时候,才会把缓冲区的数据真正写到目的地,这样能减少物理写数据的次数(增加次数会减少磁盘的寿命),从而提高I/O操作的执行效率。BufferedWriter类的常用构造方法如下所示: 

BufferedWriter(Writer out)//创建一个缓冲字符输出流

方法
    newLine()     增加换行符 

3.2.2 字符缓冲输出流贯穿示例

示例代码 


        //字符缓冲输出流
        BufferedWriter reader = null;
        try {
            //第一步 创建字符流对象
            Writer w = new FileWriter("./test/music.txt");
            //第二步 给字符流对象缓冲
            reader = new BufferedWriter(w);
            //第三步 添加数据
            reader.write("身骑白马!");
            //第四步 刷新缓冲区(把缓冲区的数据添加到输出文件中)
            reader.flush();
            System.out.println("添加成功!");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            try {
                //第五步 判断是否为空,不为空就关闭连接
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                System.out.println("关闭出现异常");
            }
        }
    }

 以上代码输出了一个“身骑白马”到输出文档文件中;

3.3 字符缓冲输入流 

3.3.1 字符缓冲输入流基本概念 

BufferedReader类是Reader的子类,它与FileReader类的区别在于BufferedReader类有缓冲区,它可以先把一批数据读到缓冲区中,接下来的读操作都是从缓冲区内获取数据,避免名称都从数据源读取数据进行字符编码转换,从而提高读取操作的效率。BufferedReader的常用构造方法如下:

BufferedReader(Reader in)

方法
readLine()

  • readLine()方法按行读取内容,最后利用while循环将读取的内容输出到控制台中,跟Reader的read()方法差不多 

3.3.2 字符缓冲输入流贯穿示例 

 示例代码

public static void main(String[] args) {
        //字符缓冲输入流
        BufferedReader bf = null;
        try {
            //第一步 创建输入流对象
            Reader r = new FileReader("./test/music.txt");
            //第二步 缓冲输入流对象
            bf = new BufferedReader(r);
            //第三步 获取数据,每次获取一行数据
            String data = bf.readLine();
            while (data != null) {
                //第四步 循环打印数据,不为空就打印
                System.out.println(data);
                //第五步 给数据进行迭代
                data = bf.readLine();
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                //第六步 判断是否为空,不为空就关闭连接
                if (bf != null) {
                    bf.close();
                }
            } catch (IOException e) {
                System.out.println("关闭发生异常");
            }
        }
    }

运行结果 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学几招静态路由配置技巧,让你事半功倍!

中午好,我的网工朋友。 静态路由是在网络设备上手动配置的路由信息,用于指定数据包的传输路径。 无论是项目中交换机的静态路由配置,还是在公司网络中路由器的静态路由设置,都有非常多的应用。 与动态路由协议不同,…

java每日一题——幸运囚犯(合集遍历,查询数据练习)

前言: 合集基本学完了,做做题巩固下知识点。打好基础,daydayup! 题目如下: 目前有100名囚犯,每个囚犯的编号是1-200之间的随机数。现在要求依次随机生成100名囚犯的编号(要求这些囚犯的编号是不能重复的&a…

DCDC电源管理芯片MC34063A,内含温度补偿的参考电压源(1.25V)、比较器、能有效限制电流及控制工作周期的振荡器,驱动器及大电流输出开关管等

MC34063A 为一单片 DC-DC 变换集成电路,内含温度补偿的参考电压源(1.25V)、比较器、能有效限制电流及控制工作周期的振荡器,驱动器及大电流输出开关管等。外配少量元件,就能组成升压、降压及电压反转型 DC-DC 变换器。…

基于net的医院病历管理系统

摘 要 伴随着我国社会的发展,人民生活质量日益提高。互联网逐步进入千家万户,改变传统的管理方式,医院病历管理系统以互联网为基础,利用net技术,和SQL Server数据库开发设计一套医院病历管理系统,提高工作…

C++第九弹---类与对象(六)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 日期类 1、日期类的分析和设计 1.1、日期类的功能说明 1.2、日期类的分析和设计 1.2.1、数据结构的分析 1.2.2、文件结构设计 2、日期类的结构分析…

Blender 3D建模要点

3d模型可以为场景的仿真模拟带来真实感,它还有助于更轻松地识别场景中的所有内容。 例如,如果场景中的所有对象都是简单的形状,如立方体和圆形,则很难在仿真中区分对象。 1、碰撞形状与视觉形状 像立方体和球体这样的简单形状&a…

火灾自动报警及消防联动控制系统主机的九个主要组成部分

关于火灾报警联动系统的主机组成,一般有两种不同的概括,下面分别讨论。 一: 火灾报警主机的组成部分较多,主要包括以下消防设备:主电源、联动电源、打印机、驱动器、直接控制板、总线控制板、消防广播、消防电话主机…

免费Web应用防火墙:uuWAF

一款国产的由社区驱动的免费、高性能、高扩展顶级Web应用安全防护产品-南墙。南墙 WEB应用防火墙(简称:uuWAF)是有安科技推出的一款全方位网站防护产品。通过有安科技专有的WEB入侵异常检测等技术,结合有安科技团队多年应用安全的…

多功能、功耗低。工作温度范围宽(-40℃~+80℃),性价比高,并可与MAXIM、AD等公司的uP监控产品兼容的国产芯片——D706

概 述 近年来,微处理器在IT业控制领域和智能化产品中得到了广泛的应用。在系统和产品的开发设计过程中,为了提高其抗干扰能力,使用uP监控是首选技术措施之一。监控芯片可为系统提供上电、掉电复位功能,也可提供其它功能&#x…

【感悟《剑指offer》典型编程题的极练之路】01数组篇!

​​​​​​​ ​​​​​​​ 个人主页:秋风起,再归来~ ​​​​​​​ 文章所属专栏:《剑指offer》典型编程题的极练之路 ​​​​​​​ ​​​​​​​ …

CSS其他属性

文章目录 1. vertical-align1.1. 概念1.2. 常用值1.3. 作用1.4. 出现的情况一1.4.1. 原因1.4.2. 解决方案 1.5. 出现情况二1.5.1. 解决方案一1.5.2. 解决方案二1.5.3. 解决方案三 1.6. 出现情况三1.6.1. 原因1.6.2. 解决方案 2. 溢出效果2.1. 作用2.2. 属性名 3. 隐藏效果3.1. …

买卖股票的最佳时机1,2,3

买卖股票的最佳时机 力扣题目链接 dp[i][0] 表示第i天持有股票所得最多现金 定义二维数组 两列 :0代表持有股票 1代表不持有股票 行代表第几天 dp[i][0] max(dp[i - 1][0], -prices[i]); 第i天持有股票:两种情况 第一种是昨天就已经持有股票了 所…

NVM使用教程

文章目录 ⭐️写在前面的话⭐️1、卸载已经安装的node2、卸载nvm3、安装nvm4、配置路径以及下载源5、使用nvm下载node6、nvm常用命令7、全局安装npm、cnpm8、使用淘宝镜像cnpm9、配置全局的node仓库🚀 先看后赞,养成习惯!🚀&#…

探索AI+电商领域应用与发展

AI火的已经一塌糊涂了,已经有很大一部分的企业和个人已经坐上了这趟超音速列车,但对于电商领域具体都有哪些助理,目前为止还是比较散,今天来顺一下AIGC之与电商到底带来了些什么? 一、什么是AIGC AIGC是内容生产方式…

个人开发者上架App流程

摘要 个人开发者完全可以将自己开发的App上传至应用商店进行上架。本文将介绍上架流程的通用步骤,包括确定App功能和定位、准备相关资料、开发App、提交审核、发布App和宣传推广等内容。 引言 个人开发者在如今的移动应用市场中也有机会将自己的作品推向更广泛的…

C++之模版详解

一.array与vector对比 由图发现&#xff0c;使用array数组是必须提前开好空间&#xff0c;而vector是顺序表&#xff0c;可以实现动态开辟空间 array也支持迭代器&#xff0c;如下&#xff1a; int main() {array<int, 10> arr{ 1,2,3,4,5,6,7,8,9,10 };auto it arr.be…

重生奇迹MU 的全部地图

卓越首饰类&#xff1a;火项链、毒戒指——海1小巴、美人鱼、卡2门口&#xff0c;卡1最里面&#xff0c;地3等等 雷项链&#xff0c;冰戒指——海1蓝翼怪&#xff0c;卡2龙虾以上&#xff0c;失落3&#xff08;门口黄金点哦&#xff0c;盛产冰戒指&#xff09;等等 冰项链——…

第十二届蓝桥杯省赛CC++ 研究生组-货物摆放

还是整数分解问题,注意n本身也是约数 #include <iostream> int main(){printf("2430");return 0; }#include <iostream> #include<cmath> #include<algorithm> using namespace std; typedef long long ll; const ll n 2021041820210418LL…

Jenkins 一个进程存在多个实例问题排查

Jenkins 一个进程存在多个实例问题排查 最近Jenkins升级到2.440.1​版本后&#xff0c;使用tomcat​服务部署&#xff0c;发现每次定时任务总会有3-4个请求到我的机器人上&#xff0c;导致出现奇奇怪怪的问题。 问题发现 机器人运行异常&#xff0c;总有好几个同时请求的服务。…

宋仕强论道之华强北科技创新说

宋仕强论道之华强北科技创新说&#xff0c;“创新”是深圳市和华强北灵魂&#xff0c;创新再加上敢想敢干永不言败&#xff0c;造就了深圳市经济奇迹和华强北财富神话&#xff01;首次在深圳市落槌的“土地拍卖”&#xff0c;华强北“一米柜台”赋予独立经营权&#xff0c;把最…