IO流基础

IO流介绍

1.什么是IO流?

                流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序列或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出的,即数据像流体一样连绵不绝进行传输。


I 即Input,输入。O 即Output,输出。

IO流能干什么?

IO流可以在本地磁盘和网络上对数据进行传输,比如说,字符流可以向一个空的文本文件中写入数据,或是从一个未知文本文件中读取数据,还可以进行文件的拷贝。而字节流则常用于拷贝图片。


 IO流的分类:

IO流体系: 

不多bb,还是直接上图片!如图:

        首先是字符流:

 再来看一下字符流(文本文件)的类图,如下 : 

然后是字节流:

 再来看一下字节流(二进制文件)的类图,如下 : 

字符流读写文件:

1.普通字符流读取文件:
                前言:         
                使用普通字符流来读取文件(FileReader)时,共有两种方式,分别是①以单个字符读取,②以字符数组读取,两种方式大同小异,因此up会重点把第一种详细讲好,第二种就没那么难了。
                使用普通字符流来写入文件(FileWriter)时,一共有三种方式,分别是①以单个字符写入,②以字符数组写入,③以字符串形式写入,同样,三种方式大同小异,up还是重点讲解第一种方式。

1.以单个字符读取:       
                步骤:

                1) 创建字符输入流对象,关联数据源文件 (建议第一步就抛出父类异常IOException)

                2) 定义变量,记录读取到的内容

                3) 循环读取,只要条件满足就一直读,并将读取到的内容赋值给变量

                4) 释放资源。(为防止遗忘,最好先释放资源。)

读取方法:

                需要调用Reader类中的read() 方法:
                int read(): 每次读取一个字符,返回该字符对应的ASCII码值(整数), 若达到流的末尾,返回-1。

由于Reader类是抽象类,因此需要多态的方式来实例化其子类。Reader类的常用子类是FileReader类。其构造方法为:
                public FileReader(String pathName) 需要传入要读取文件的路径的字符串形式,来获取字符输入流对象。

/*** 字符流读数据*      Reader类中的方法*          int read():         每次读取一个字符,返回该字符对应的ASCII码值(整数),*                              若达到流的末尾,返回-1*
*       FileReader类的构造方法*          public  FileReader(String pathName)*          ①根据传入的字符串形式的路径,获取字符输入流对象*          ②注意因为Reader类是抽象类,所以需要通过多态的方式来实例化它的子类。*/public class demo_1 {public static void main(String[] args) throws IOException {//1.创建字符输入流对象,关联数据源文件。Reader reader=new FileReader("C:\\Users\\22652\\Desktop\\程序\\1.txt");while (true){//2.定义变量,记录读取到的内容。int tmp=reader.read();if (tmp==-1){break;}System.out.print((char) tmp);}//4.释放资源        //为防止遗忘,最好先释放资源reader.close();}
}

上图中读取很麻烦,我推荐一种更好的写法。 


public static void main(String[] args) throws IOException {
/*使用 try-with-resources 时,无需手动关闭实现了 AutoCloseable 接口的资源。
在 try 代码块执行完毕后,系统会自动调用资源的 close() 方法来关闭资源,
无需编写繁琐的 finally 块。这样,我们不仅减少了代码量,还避免了由于忘记关闭资源而导致的潜在资源泄漏问题
*/try(Reader reader=new FileReader("C:\\Users\\22652\\Desktop\\程序\\1.txt")){while (true){int tmp=reader.read();if (tmp==-1){break;}System.out.print((char) tmp);}}}

 try with的加入--http://t.csdnimg.cn/dDlvD,不用我们来关闭文件;

字符数组读取: 
                以单个字符的形式读取文件要是会了,这个就是小菜一碟了。老规矩,还是先把步骤和读取方法给大家说一下:

                步骤:

                1) 创建字符输入流对象,关联数据源文件 (建议第一步就抛出父类异常IOException)

                2) 定义变量,记录读取到的内容

                3) 循环读取,只要条件满足就一直读,并将读取到的内容赋值给变量

                4) 释放资源。(为防止遗忘,最好先释放资源。)

public class demo_2 {public static void main(String[] args) throws IOException {try(Reader reader=new FileReader("C:\\Users\\22652\\Desktop\\程序\\1.txt")){char[] chars=new char[1024];while (true){int tmp=reader.read(chars);if (tmp==-1){break;}for (int i = 0; i < tmp; i++) {System.out.print(chars[i]);}}}}
}

 普通字符流写入文件

步骤:

                创建字符输入流对象,关联目的地文件。(建议第一步就抛出父类异常IOException)

                将目标内容写入到目的地文件中

                释放资源

public static void main(String[] args)throws IOException {try(Writer writer= new FileWriter("C:\\Users\\22652\\Desktop\\程序\\2.txt")){writer.write('说');writer.write('话');writer.write('啊');writer.write("hello java");}}

FileReader和FileWriter这两个流都是字符流,都是以一个字符为单位进行输入和输出的。所以读取和写入占用2个字节的字符时都可以正常地显示出来,以上是以File(文件)这个类型为例对节点流进行了讲解,所谓的节点流指定就是直接把输入流或输出插入到数据源上,直接往数据源里面写入数据或读取数据。

在诸多处理流中,有一个非常重要,那就是缓冲流。

我们知道,程序与磁盘的交互相对于内存运算是很慢的,容易成为程序的性能瓶颈。减少程序与磁盘的交互,是提升程序效率一种有效手段。缓冲流,就应用这种思路:普通流每次读写一个字节,而缓冲流在内存中设置一个缓存区,缓冲区先存储足够的待操作数据后,再与内存或磁盘进行交互。这样,在总数据量不变的情况下,通过提高每次交互的数据量,减少了交互次数。

需要注意的是,缓冲流效率一定高吗?不一定,某些情形下,缓冲流效率反而更低,具体请见IO流效率对比。

字符缓冲流(高效字符流):

  ①字符缓冲流介绍:
                字符缓冲流,又叫做高效字符流。字符缓冲流自带有缓冲区,大小为8192个字符,也就是16KB。 (即字节数:16*1024 == 8192*2) ---->(Unicode编码一个中文或英文字符都是占两个字节)。

                ②字符缓冲流的普通用法:
                使用字符缓冲流来拷贝文件时,依然遵循经典的IO流拷贝文件核心六部曲,因此为什么我强调要把IO流拷贝文件核心六部曲全文背诵?因为太经典了!几乎可以可以做到一招通吃。
                但是,与之前有差异的地方在于,在创建高效字符输入流对象时,并不是直接传入数据源文件的路径了,而是要传入一个普通的字符输入流对象,而我们知道,普通读文件对象在创建时传入的就是数据源文件的路径了,因此,可以总结为:创建高效字符输入流对象需要传入一个 ‘已经关联数据源文件的普通字符输入流对象’ 。仔细品味这句话,高效字符输出流也是同理。一下子看不懂也没有关系,毕竟都是带抽象,没上手过纯纯天书,还是直接举个栗子直观一点:

//声明:以下是仅作差异演示的代码段,并不完整,完整代码在之后的代码演示中会有//1.我们先创建一个普通字符输入流对象Reader reader = new FileReader("Test/1.txt");//2.好,有了普通字符输入流对象后,我们就可以创建高效字符输入流对象了。BufferedReader bufferedReader = new BufferedReader(reader);
//这样我们就得到了一个高效字符输入流对象bufferedReader。//其实,实际开发中往往采用链式编程优化代码,如下:BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("Test/2.txt"));//说白了就是把1. 2. 两步合起来了,看着简洁直观。

字符缓冲流的特有用法:
                BufferedReader类中的方法:
                public String readLine() : 一次读取一行数据并返回读取到的内容,读不到返回null,
                该方法可以用String类型的变量作接收。

                BufferedWriter类中的方法:
                public void newLine: 根据当前操作系统给出相应的换行符 (注释中有详解)

字节流读写文件:

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

public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello.txt")) {while (true) {int b = is.read();if (b == -1) {// 代表文件已经全部读完break;}System.out.printf("%c", b);}}}
利用 UTF-8 读取字符

import java.io.*;
// 需要先在项目目录下准备好一个 hello.txt 的文件,里面填充 "你好中国" 的内容
public class Main {public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello.txt")) {byte[] buf = new byte[1024];int len;while (true) {len = is.read(buf);if (len == -1) {// 代表文件已经全部读完break;}// 每次使用 3 字节进行 utf-8 解码,得到中文字符// 利用 String 中的构造方法完成// 这个方法了解下即可,不是通用的解决办法for (int i = 0; i < len; i += 3) {String s = new String(buf, i, 3, "UTF-8");System.out.printf("%s", s);}}}}
}

 这个方法了解下即可,不是通用的解决办法

利用Scanner来读取进行字符读取。

FileOutputStream: 普通字节输出流,用来写出数据的
           成员方法:
             public void write(byte[] b,int index, int len) :
                  一次写入一个指定的字节数组,需要传入数组名,起始索引,有效长度

import java.io.*;
import java.util.*;
// 需要先在项目目录下准备好一个 hello.txt 的文件,里面填充 "你好中国" 的内容
public class Main {public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello.txt")) {try (Scanner scanner = new Scanner(is, "UTF-8")) {while (scanner.hasNext()) {String s = scanner.next();System.out.print(s);}}}}
}

上述,我们其实已经完成输出工作,但总是有所不方便,我们接来下将 OutputStream 处理下,使用
PrintWriter 类来完成输出,因为
PrintWriter 类中提供了我们熟悉的 print/println/printf 方法
 public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("output.txt")) {try (OutputStreamWriter osWriter = new OutputStreamWriter(os, "UTF-
8")) {try (PrintWriter writer = new PrintWriter(osWriter)) {writer.println("我是第一行");writer.print("我的第二行\r\n");writer.printf("%d: 我的第三行\r\n", 1 + 1);writer.flush();}}}}

 拷贝

try (InputStream inputStream = new FileInputStream(srcFile);OutputStream outputStream = new FileOutputStream(destFile)) {while (true) {byte[] buffer = new byte[20480];int n = inputStream.read(buffer);System.out.println("n = " + n);if (n == -1) {System.out.println("读取到 eof, 循环结束. ");break;}outputStream.write(buffer, 0, n);}}

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

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

相关文章

JVM (Micrometer)监控SpringBoot(AWS EKS版)

问题 怎样使用JVM (Micrometer)面板&#xff0c;监控Spring&#xff1f;这里不涉及Prometheus和Grafana&#xff0c;重点介绍与Micrometer与Springboot&#xff0c;k8s怎样集成。 pom.xml 引入依赖&#xff0c;如下&#xff1a; <properties><micrometer.version&…

免费简单好用的内网穿透工具(ngrok、natapp),微信回调地址配置

B站视频地址 文章目录 Natapp1、登录注册账号、下载软件2、使用2-1、购买隧道、查看token2-2、端口穿透 Ngrok1、登录注册账号、下载软件2、使用2-1、获取并设置 token2-2、使用 3、隧道 微信回调配置1、注册测试公众号2、回调代码3、回调配置 在一些特殊的场景下&#xff0c;需…

多种方法求1+12+123+1234……

有网友出了一道题&#xff1a; 从键盘输入一个小于10的正整数n&#xff0c;计算1121231234……&#xff0c;即前n项之和。 第一眼看到题目&#xff0c;直觉告诉我必须使用嵌套的两个for循环&#xff0c;里面的循环生成每一项&#xff0c;外面的循环求和。错误的方向和思路让我…

基于RBF-PID控制器的风力发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于RBF-PID控制器的风力发电系统simulink建模与仿真,对比PID控制器和RBF-PID控制器的控制结果。 2.系统仿真结果 3.核心程序与模型 版本&#xff1a;MATLAB2022a 0050 4.系…

Unity进阶之ScriptableObject

目录 ScriptableObject 概述ScriptableObject数据文件的创建数据文件的使用非持久数据让其真正意义上的持久ScriptableObject的应用配置数据复用数据数据带来的多态行为单例模式化的获取数据 ScriptableObject 概述 ScriptableObject是什么 ScriptableObject是Unity提供的一个…

有没有电脑桌面监控软件|十大电脑屏幕监控软件超全盘点!

电脑桌面监控软件已经成为许多领域不可或缺的工具。 无论是企业为了保障数据安全和提高工作效率&#xff0c;还是家长为了监督孩子的学习&#xff0c;甚至是个人为了记录电脑使用行为&#xff0c;都需要这类软件的支持。 本文将对市面上十大电脑屏幕监控软件进行超全盘点&…

智能文案生成器,文案生成改写很强大

在当今数字化时代&#xff0c;随着人工智能的迅猛发展&#xff0c;智能文案生成器正逐渐成为营销和创作领域的一大利器。这些智能工具不仅能够快速生成文案&#xff0c;还能够进行文案改写&#xff0c;使得文案生成的过程更加高效、便捷。正是在这样的背景下&#xff0c;智能文…

CAT:contig稳健物种分类

安装 mamba create -n CAT python3.10 diamond prodigal cd SoftWare git clone https://github.com/MGXlab/CAT_pack chmod 755 给权限 自己构建数据库 names.dmp nodes.dmp文件可以在Kraken2的文件里面找到 Kraken2Bracken&#xff1a;宏基因组物种注释_kracken2配合bracke…

MySQL之binlog归档日志

binlog&#xff08;二进制归档日志&#xff09; binlog 二进制日志记录保存所有执行过的修改操作语句&#xff0c;不保存查询操作。如果 MySQL 服务意外停止&#xff0c;可通过二进制日志文件排查&#xff0c;用户操作或表结构操作&#xff0c;从而来恢复数据库数据。启动 bin…

Java 线程的几种状态

一、 线程的状态 状态是针对当前的线程调度的情况来描述的。因为线程是调度的基本单位&#xff0c;所以状态更应该是线程的属性。在Java中线程的状态一共有六种&#xff1a; 1. 初始(NEW)&#xff1a;新创建了一个线程对象&#xff0c;但还没有调用start()方法。 2. 运行(RUNN…

动静态库以及动态链接

文章目录 静态库制作静态库如何使用静态库 动态库动态库的制作动态库的使用动态链接 库是给别人用的&#xff0c;所以库中一定不存在main函数。库一般会有lib前缀和后缀&#xff0c;去掉前缀和后缀才是库名。 静态库 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译…

C++|对象与const

目录 常对象 常对象的声明 性质 数据成员不能被修改 常对象不能调用非const成员函数 const型成员函数 常对象成员 常数据成员 常成员函数 注意 总结 const型数据成员 const型成员函数 常对象 指针与const 指向对象的常指针 应用场景 指向常对象的指针 指向常…

Swagger3.0(Springdoc)日常使用记录

文章目录 前言一、默认地址二、注解OperationTag 三、SpringBoot基础配置四、Swagger导入apifox五、Swagger其他配置六 knife4j 参考文章 前言 本文并不是Swagger的使用教程&#xff0c;只是记录一下本人的操作&#xff0c;感兴趣的可以看下 一、默认地址 http://localhost:…

【1731】jsp 房租跟踪监控管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 房租跟踪监控管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…

Java 基础常见面试题整理

目录 1、java的基本数据类型有哪些&#xff1f;2、java为什么要有包装类型&#xff1f;3、String a "123" 和 String a new String("123") 区别&#xff1f;4、String、StringBuilder和StringBuffer的区别&#xff1f;5、如何理解面向对象和面向过程&…

浅谈叉车车载电脑的市场现状

叉车的起源 叉车源于美国&#xff0c;兴于日本&#xff0c;虽然中国起步较晚&#xff0c;但是近些年来发展迅速。叉车又称叉式装载车&#xff0c;是对于成件托盘类货物进行装卸、堆垛和短距离运输&#xff0c;实现重物搬运作业的轮式工业车辆。 叉车的分类 叉车分为以上六大类…

CSS学习(选择器、盒子模型)

1、CSS了解 CSS&#xff1a;层叠样式表&#xff0c;一种标记语言&#xff0c;用于给HTML结构设置样式。 样式&#xff1a;文字大小、背景颜色等 p标签内不能嵌套标题标签。 px是相对于分辨率而言的&#xff0c; em是相对于浏览器的默认字体&#xff0c; rem是相对于HTML根元…

刷题日记 ---- 顺序表与链表相关经典算法题(C语言版)

目录 1. 移除元素2. 合并两个有序数组3. 移除链表元素4. 反转链表5. 合并两个有序链表6. 链表的中间结点7. 环形链表的约瑟夫问题8. 分割链表总结 正文开始 1. 移除元素 题目链接: 移除元素 题目描述: 思路历程: 题目明确要求, 不能使用额外的数组空间, 也就是说不可以创建…

【优质书籍推荐】AIGC时代的PyTorch 深度学习与企业级项目实战

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

springcloud按版本发布微服务达到不停机更新的效果

本文基于以下环境完成 spring-boot 2.3.2.RELEASEspring-cloud Hoxton.SR9spring-cloud-alibaba 2.2.6.RELEASEspring-cloud-starter-gateway 2.2.6.RELEASEspring-cloud-starter-loadbalancer 2.2.6.RELEASEnacos 2.0.3 一、思路 实现思路&#xff1a; 前端项目在请求后端接…