一篇文章教你学会Java基础I/O流
文章目录
- 一、初始IO流
- 1、什么是流
- 2、IO流的分类
- 二、字节输入输出流
- 1、字节输入流(InputStream)
- 2、字节输出流(OutputStream)
- 3、文件拷贝
- 三、处理流和转换流
写在前面: 我是「境里婆娑」。我还是从前那个少年,没有一丝丝改变,时间只不过是考验,种在心中信念丝毫未减,眼前这个少年,还是最初那张脸,面前再多艰险不退却。
写博客的目的就是分享给大家一起学习交流,如果您对 Java感兴趣,可以关注我,我们一起学习。
前言:为什么要写这篇文章,由于长时间不使用I/O流操作,导致很多知识都朦朦胧胧似懂非懂,今天抽空把这部分内容认真复习了下,顺便写篇文章加深印象。I/O流在很多场景中都有使用,比如文件上传下载、socket通信等。本文主要介绍常用字节流,其它字符流、转换流用法类似就不一一介绍。
一、初始IO流
1、什么是流
数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input 和输出output ,即流向内存是输入流,流出内存的输出流。
Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。简而言之,输入也叫做读取数据,输出也叫做作写出数据。
2、IO流的分类
按照流的方向可以分为:输入流和输出流
- 输入流 :把数据从其他设备上读取到内存中的流。
- 输出流 :把数据从内存 中写出到其他设备上的流。
按照流的类型可以分为:字节流和字符流
- 字节流 :以字节为单位。
- 字符流 :以字符为单位。
字节流和字符流的超类如下所示
流类型 | 输入流 | 输出流 |
---|---|---|
字节流 | InputStream | OutputStream |
字符流 | Reader | Writer |
字节流和字符流不同之处
- 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
- 处理对象不同:字节流能处理所有类型的数据(如图片、视频、音频等),而字符流只能处理字符类型的数据。
总结:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流
字节流和字符流实现类汇总
二、字节输入输出流
一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。
1、字节输入流(InputStream)
InputStream抽象类字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。
1、public abstract int read();
2、 public void close();
3、public long skip(long n);
4、public synchronized void mark(int readlimit);
5、public synchronized void reset();
我们以FileInputStream读取文件为例
FileInputStream读取字节数据
test.txt文件内容为:123123123
1、读取字节:read方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回-1,代码如下:
public static void testFileInPut()throws Exception {FileInputStream inputStream = new FileInputStream("D:\\aplus\\test.txt");int b;while ((b = inputStream.read()) != -1) {System.out.println((char)b);}inputStream.close();}
2、使用字节数组读取:read(byte[] b),每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回-1 ,代码如下:
public static void testFileInPut1()throws Exception {FileInputStream inputStream = new FileInputStream("D:\\aplus\\test.txt");int b;byte[] bytes = new byte[2];while ((b = inputStream.read(bytes)) != -1) {System.out.println(b);System.out.println("======");System.out.println(new String(bytes));}inputStream.close();}
输出结果:
12
31
23
12
32
我们发现结果不正确,最后一个为啥事32,这是由于最后一次读取时,只读取一个字节3,数组中,上次读取的数据没有被完全替换,所以要通过len ,获取有效的字节。
每次读取后,把数组的有效字节部分,变成字符串打印
代码改造如下:
public static void testFileInPut1()throws Exception {FileInputStream inputStream = new FileInputStream("D:\\aplus\\test.txt");int b;byte[] bytes = new byte[2];while ((b = inputStream.read(bytes)) != -1) {//System.out.println(new String(bytes));System.out.println(new String(bytes,0,b));}inputStream.close();}
2、字节输出流(OutputStream)
.OutputStream抽象类输出流是所有类的超类(父类),将指定的字节信息写出到目的地。定义了字节输出流公共方法。
1、public abstract void write(int b)
2、public void write(byte b[])
3、public void write(byte b[], int off, int len)
4、 public void flush()
5、public void close()
我们以FileOutputStream写出文件为例
使用FileOutputStream写出字节数据主要通过Write方法,而write方法分如下三种
public void write(int b)
public void write(byte[] b)
public void write(byte[] b,int off,int len) //从`off`索引开始,`len`个字节
1、write(int b)每次写出一个字节数据,代码如下:
public static void testFileOutPut()throws Exception {FileOutputStream outputStream = new FileOutputStream("D:\\aplus\\out.txt");outputStream.write(98);outputStream.write(99);outputStream.flush();outputStream.close();}
2、写出字节数组:write(byte[] b),每次可以写出数组中的数据,代码如下:
public static void testFileOutPut1()throws Exception {FileOutputStream outputStream = new FileOutputStream("D:\\aplus\\out.txt");byte[] b = "我是java高手".getBytes();outputStream.write(b);outputStream.close();}
3、写出指定长度字节数组:write(byte[] b, int off, int len) ,每次写出从off索引开始,len个字节,代码如下:
public static void testFileOutPut2()throws Exception {FileOutputStream outputStream = new FileOutputStream("D:\\aplus\\out.txt");byte[] b = "java".getBytes();outputStream.write(b,0,2);outputStream.close();}
FileOutputStream实现数据追加续写
FileOutputStream提供了一个构造函数FileOutputStream(File file, boolean append),当boolean为true时表示追加数据。
public static void testFileOutPut3()throws Exception {FileOutputStream outputStream = new FileOutputStream("D:\\aplus\\out.txt",true);byte[] b = "java".getBytes();outputStream.write(b);outputStream.close();}
3、文件拷贝
上面已经详细介绍了字节输入和输出流,我们现在做一个例子实现图片的拷贝。
上面的写法不规范,下面我们写一个规范的文件拷贝,代码如下:
public static void filePhotoCopy() {FileInputStream inputStream = null;FileOutputStream outputStream = null;try {inputStream = new FileInputStream("D:\\aplus\\IO流.png");outputStream = new FileOutputStream("D:\\aplus\\IOCopy.png");byte[] b = new byte[1024];int i;while ((i = inputStream.read(b)) != -1) {outputStream.write(b,0,i);outputStream.flush();}System.out.println("拷贝完成");} catch (Exception e) {} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (outputStream != null) {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}}
三、处理流和转换流
处理流和节点流一块使用,在节点流的基础上,再套接一层,套接在节点流上的就是处理流。
常用的处理流
- 缓冲流:BufferedInputStrean 、BufferedOutputStream、 BufferedReader、 BufferedWriter 增加缓冲功能,避免频繁读写硬盘。
- 转换流:InputStreamReader 、OutputStreamReader实现字节流和字符流之间的转换。
- 数据流: DataInputStream 、DataOutputStream 等-提供将基础数据类型写入到文件中,或者读取出来。
———————————————————————————————————
***由于本人水平有限,难免有不足,恳请各位大佬不吝赐教!
一篇文章教你学会Java基础I/O流相关推荐
- 一篇文章教你学会Java基础JDBC
文章目录 一.搭建JDBC开发环境 1.搭建工程 2.连接数据库工具类JdbcConnectionUtil 3.main方法测试 二.创建Statement或PreparedStatement接口,执 ...
- 一篇文章教你学会Java泛型
文章目录 一.原生态类型 1.什么是原生态类型 2.使用原生态类型 有什么不好 3.泛型的子类型规则 4.泛型的可擦除性 二.泛型常用形式 1.泛型方法 2.泛型单例工厂 三.有限制的通配符类型 四. ...
- 一篇文章教你学会使用SpringBoot实现文件上传和下载
文章目录 一.搭建SpringBoot开发环境 1.创建项目 2.配置application.properties参数 3.实体响应类和异常信息类 4.创建FileController 二.接口测试 ...
- 一篇文章教你学会使用SpringBatch 监听器Listener
文章目录 一.SpringBatch监听器 二.搭建SpringBatch开发环境 三.监听器详细介绍 1.JobExecutionListener 2.StepExecutionListener 3 ...
- 一篇文章教你学会实现模糊搜索结果的关键词高亮显示
一篇文章教你学会实现模糊搜索结果的关键词高亮显示 话不多说,先看效果图: 代码如下: <!DOCTYPE html> <html lang="en">< ...
- 一篇文章教你学会如何使用CSS中的雪碧图(CSS Sprite)
一篇文章教你学会如何使用CSS中的雪碧图(CSS Sprite) 一.什么是雪碧图? 雪碧图(CSS Sprite)又叫CSS精灵图,是一种网页图片应用处理方式,他允许你将一个页面设计到 所有零星图片 ...
- 适合零基础学习者的Java学习路线图到底长啥样?一篇文章带你学会Java
很多小伙伴在转行互联网的时候,都担心自己不能坚持,不知道Java适不适合自己. 那最好的方式就是先不要着急直接转行,自己可以先去试着学习一些基础知识,看看对Java的学习难度能否适应以及自己是否真心喜 ...
- html网页怎么向文章,一篇文章教你学会HTML
html是学习做网页的基础,漂亮的网页与布局就是由有些html代码组成,大家看完这篇文章就可以简单的了解html了,多写多练. 如果你不致力于成为美工的话,那么作为开发人员,可以读懂HTML.必要时能 ...
- 英文连写字体怎么练_一篇文章教孩子学会衡水英文字体,建议收藏!
"衡水体"实质上是衡水中学学生书写的手写印刷体, 随着中考高考电子阅卷的普及,采用简洁.工整.快速的字体进行书写成为必需,极大地迎合了阅卷老师心理和电脑显示特点.一定程度上有助于大 ...
最新文章
- 多款激光雷达性能评估
- python读取一个文件夹/子文件夹下的所有文件名字
- 虚拟机里Centos7的IP地址查看方法
- 为什么忘记commit也会造成select查询的性能问题
- SpringMVC拦截器-用户登录权限控制代码实现2
- SAP Commerce Cloud WCMS 里的 home 页面和 SAP Spartacus Page API 返回的数据比较
- 自定义view实现水波纹效果
- 为什么要远程连接Linux
- OS之宏内核(Monolithic kernel)和微内核(Microkernel)详解
- 【概率论与数理统计】小结7 - 统计学中的基本概念
- Tomcat 部署多个项目出现错误
- cad修改快捷键_怎么编辑CAD快捷键?
- php音频怎么打开,音频管理器怎么设置
- 用户注册时图片验证码和短信验证码的逻辑
- 云计算的发展趋势(一)云计算相关领域介绍
- ac6005直连ap 如何配置_【无线】 AC直连AP配置
- Failed to introspect Class [org.springframework.cloud.context.properties.ConfigurationPropertiesBean
- matlab中magy是什么意思,MATLAB入门基本知识——音频处理
- echarts折线图设置横向基准线/水平线,超过基准线时折线会变色
- Flutter 转 null safe时报错: The argument type ‘Object‘ can‘t be assigned to the parameter type XXX
热门文章
- html 价格列表组件,评价列表ratings组件
- matlab显示像素分布,MATLAb-----7--------如何动态显示鼠标的坐标值和图像像素值
- PyQt5 笔记5 -- 消息框(QMessageBox)
- 签约中国搜索,第四范式助力智慧媒体转型发展
- ICML 2020 | 第四范式基于AutoML的深度网络记忆性自动化挖掘
- python3精要(37)-wxPython(3)-安装
- vb.net 机器学习-候选消除法
- rust(25)-皮尔逊相关系数
- 【学术相关】大学老师的职业前景究竟怎么样?薪资待遇如何?
- 【算法基础】漫画:什么是 “跳表” ?