文章目录

  • 一、初始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流相关推荐

  1. 一篇文章教你学会Java基础JDBC

    文章目录 一.搭建JDBC开发环境 1.搭建工程 2.连接数据库工具类JdbcConnectionUtil 3.main方法测试 二.创建Statement或PreparedStatement接口,执 ...

  2. 一篇文章教你学会Java泛型

    文章目录 一.原生态类型 1.什么是原生态类型 2.使用原生态类型 有什么不好 3.泛型的子类型规则 4.泛型的可擦除性 二.泛型常用形式 1.泛型方法 2.泛型单例工厂 三.有限制的通配符类型 四. ...

  3. 一篇文章教你学会使用SpringBoot实现文件上传和下载

    文章目录 一.搭建SpringBoot开发环境 1.创建项目 2.配置application.properties参数 3.实体响应类和异常信息类 4.创建FileController 二.接口测试 ...

  4. 一篇文章教你学会使用SpringBatch 监听器Listener

    文章目录 一.SpringBatch监听器 二.搭建SpringBatch开发环境 三.监听器详细介绍 1.JobExecutionListener 2.StepExecutionListener 3 ...

  5. 一篇文章教你学会实现模糊搜索结果的关键词高亮显示

    一篇文章教你学会实现模糊搜索结果的关键词高亮显示 话不多说,先看效果图: 代码如下: <!DOCTYPE html> <html lang="en">< ...

  6. 一篇文章教你学会如何使用CSS中的雪碧图(CSS Sprite)

    一篇文章教你学会如何使用CSS中的雪碧图(CSS Sprite) 一.什么是雪碧图? 雪碧图(CSS Sprite)又叫CSS精灵图,是一种网页图片应用处理方式,他允许你将一个页面设计到 所有零星图片 ...

  7. 适合零基础学习者的Java学习路线图到底长啥样?一篇文章带你学会Java

    很多小伙伴在转行互联网的时候,都担心自己不能坚持,不知道Java适不适合自己. 那最好的方式就是先不要着急直接转行,自己可以先去试着学习一些基础知识,看看对Java的学习难度能否适应以及自己是否真心喜 ...

  8. html网页怎么向文章,一篇文章教你学会HTML

    html是学习做网页的基础,漂亮的网页与布局就是由有些html代码组成,大家看完这篇文章就可以简单的了解html了,多写多练. 如果你不致力于成为美工的话,那么作为开发人员,可以读懂HTML.必要时能 ...

  9. 英文连写字体怎么练_一篇文章教孩子学会衡水英文字体,建议收藏!

    "衡水体"实质上是衡水中学学生书写的手写印刷体, 随着中考高考电子阅卷的普及,采用简洁.工整.快速的字体进行书写成为必需,极大地迎合了阅卷老师心理和电脑显示特点.一定程度上有助于大 ...

最新文章

  1. 多款激光雷达性能评估
  2. python读取一个文件夹/子文件夹下的所有文件名字
  3. 虚拟机里Centos7的IP地址查看方法
  4. 为什么忘记commit也会造成select查询的性能问题
  5. SpringMVC拦截器-用户登录权限控制代码实现2
  6. SAP Commerce Cloud WCMS 里的 home 页面和 SAP Spartacus Page API 返回的数据比较
  7. 自定义view实现水波纹效果
  8. 为什么要远程连接Linux
  9. OS之宏内核(Monolithic kernel)和微内核(Microkernel)详解
  10. 【概率论与数理统计】小结7 - 统计学中的基本概念
  11. Tomcat 部署多个项目出现错误
  12. cad修改快捷键_怎么编辑CAD快捷键?
  13. php音频怎么打开,音频管理器怎么设置
  14. 用户注册时图片验证码和短信验证码的逻辑
  15. 云计算的发展趋势(一)云计算相关领域介绍
  16. ac6005直连ap 如何配置_【无线】 AC直连AP配置
  17. Failed to introspect Class [org.springframework.cloud.context.properties.ConfigurationPropertiesBean
  18. matlab中magy是什么意思,MATLAB入门基本知识——音频处理
  19. echarts折线图设置横向基准线/水平线,超过基准线时折线会变色
  20. Flutter 转 null safe时报错: The argument type ‘Object‘ can‘t be assigned to the parameter type XXX

热门文章

  1. html 价格列表组件,评价列表ratings组件
  2. matlab显示像素分布,MATLAb-----7--------如何动态显示鼠标的坐标值和图像像素值
  3. PyQt5 笔记5 -- 消息框(QMessageBox)
  4. 签约中国搜索,第四范式助力智慧媒体转型发展
  5. ICML 2020 | 第四范式基于AutoML的深度网络记忆性自动化挖掘
  6. python3精要(37)-wxPython(3)-安装
  7. vb.net 机器学习-候选消除法
  8. rust(25)-皮尔逊相关系数
  9. 【学术相关】大学老师的职业前景究竟怎么样?薪资待遇如何?
  10. 【算法基础】漫画:什么是 “跳表” ?