Java的IO流之字节流,Java中必须要学的内容,你会嘛?快打开学习

又是大家都不咋爱的星期一

今天大雄给小伙伴们

科普的是JAVA中

IO流之字节流

这个知识点

必须要学

你会么?

IO流

先来认识一下IO流:

IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式,用于操作流的类都在IO包中。

1)流按流向分为两种:

输入流,输出流。

2)流按操作类型分为两种:

字节流 :

字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的

字节流的抽象父类:

InputStream/OutputStream

字符流 :

字符流只能操作纯字符数据,比较方便。

字符流的抽象父类:

Reader/Writer

3)IO程序书写规范

使用前,导入IO包中的类

使用时,进行IO异常处理

使用后,释放资源

字节流

今天我们先来认识一下字节流

1)FileInputStream

字节流的输入,使用read()方法一次读取一个字节

把文件 zzz.txt 中的字节读取到控制台上~因为a、b、c等英文字符在底层是用 ASC 码的数字表示的,所以我们在控制台上读取的结果是数字

注意:

read()方法的返回值是int

因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的。

如果每次读取都返回 byte,有可能在读到中间的时候遇到 111111111(byte类型的-1),read() 方法遇到 -1 就会停止不读,后面的数据也就读不到了,

所以在读取的时候用 int 类型接收,像11111111会在其前面补上24个0,凑足4个字节,那么 byte 类型的 -1就变成 int 类型的 255 了。这样可以保证整个数据读完,而结束标记的-1就是 int 类型。

2)FileOutputStream

字节输出流 write() 一次写出一个字节

把字节写入到文件 yyy.txt 中

注:

1)如果不存在 yyy.txt 这个文件,程序会自动创建一个 yyy.txt

2)因为在执行 FileOutputStream() 方法的时候,会先把文件里面的内容清空,然后再来把我们要写的东西写入~

如果我们想要不删出文件里面的内容而是追加内容该如何做呢?

在FileOutputStream的构造方法中,有一个构造方法,存在一个appen参数,表示追加的意思,我们在这边设置一个 true ,表示我们是追加内容就可以了~

那么代码应该这样写~

字节流的拷贝

现在输入输出我们都掌握了,就可以搞事情了,我们来做一个拷贝图片的练习吧~

1)逐个字节的拷贝方式

这样就可以把图片copy了一份了~

上面这种通过逐个字节拷贝文件的方式,对小一点的文件还好,当对大一点文件进行拷贝的时候速度就会慢下来——效率太低~(在实际的开发中我们不考虑)

2)利用available()拷贝方法

查看API有如下的介绍

大致意思就是,available()方法可以获取到我们将要 copy 的文件的所有字节个数~这样我们就可以一次性读取需要copy的文件的数据,然后在一次性的输出出来~

但是这种方式也有一个弊端,比如我们想拷贝一个大一点的文件(像蓝光电影这种有10+G大~),那么我们在拷贝之前就需要创建一个10+G大小的数组。

要知道这些程序都是放在Java虚拟机中运行的,而Java虚拟机是虚拟在计算机的内存中(内存也不会全给Java虚拟机,一般Java的虚拟机也就100+M)就可能会导致内存溢出~,所以一般也是不推荐的~

3)定义小数组拷贝方式

这个方法综合了上面的两种方式~

所以推荐这种方式来拷贝文件

4)利用缓冲思想进行拷贝

字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想,所以提供了字节缓冲区流

带缓冲的拷贝

1)BufferedInputStream 内置了一个缓冲区(数组),BufferedInputStream 会一次性从文件中读取8*1024个,存在缓冲区中,程序在读取时,就不用找文件了,直接从缓冲区中获取,直到缓冲区中所有的数据都被读取过,BufferedInputStream才重新从文件中读取8*1024个。

2)BufferedOutputStream 也内置了一个缓冲区(数组),程序向流中写出字节时,不会直接写到文件,先写到缓冲区中,直到缓冲区写满,BufferedOutputStream 才会把缓冲区中的数据一次性写到文件里。

那么小数组的读写和带Buffered的读取哪个更快?

定义小数组如果是8*1024个字节大小和B uffered 比较的话,定义小数组会略胜一筹,因为读和写操作的是同一个数组,而Buffered操作的是两个数组。

在缓冲中存在一个 flush() 刷新方法,可以把缓冲区中的内容输出来~

flush() 和 close() 方法的区别

(偷个懒,就不写代码演示了)

flush()方法

用来刷新缓冲区的,刷新后可以再次写出 。

close()方法

用来关闭流释放资源的的,如果是带缓冲区的流对象调用了 close() 方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再进行写出操作~

流的标准处理异常代码

Java1.6版本及其以前的处理方式

try finally嵌套,原则就是当程序出现问题时,尽量把流关闭,不要占用资源~

Java 1.7的版本以后的写法

原理:在 try() 中创建的流对象必须实现了 AutoCloseable 这个接口,实现了 AutoCloseable 接口以后 , 在 try 后面的大括号 {}中的读写代码执行后,就会自动调用流对象的 close 方法将流关掉~

今天就到这里了

小伙伴们要

多思考这些必学的内容

达到精益求精

原文发布于微信公众号 - 老九学堂(xuetang9)

原文发表时间:2018-11-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT技术精选文摘

易犯的Java内存泄漏代码

Java隐式地通过GC(守护线程)回收内存。 GC定期检查是否存在无法访问的对象,或者确切地说,没有指向该对象的引用。如果是这样,GC回收新可用的内存。 现在...

2207
来自专栏Java 技术分享

Struts2 转换器

1222
来自专栏Android 研究

Retrofit解析5之代理设计模式

即Proxy Pattern,23种常用的面向对象软件设计模式之一。(设计模式的说法源自<设计模式>一书,原名<Design Patterns:Elements...

1363
来自专栏沈唁志

提高PHP编程效率的53个要点

2096
来自专栏韩伟的专栏

框架设计原则和规范(完)

祝大家圣诞节快乐!有事没事别出门,外面太!挤!了! 此文是《.NET:框架设计原则、规范》的读书笔记,本文内容较多,共分九章,今天推送最后一章。 1. 什么是好...

2884
来自专栏用户画像

浅析JVM

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模...

872
来自专栏owent

我们的Lua类绑定机制

最近一个人搞后台,框架底层+逻辑功能茫茫多,扛得比较辛苦,一直没抽出空来写点东西。

2841
来自专栏北京马哥教育

符合语言习惯的 Python 优雅编程技巧

Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。要写出 Pythonic(优雅的、地道的、整洁的)代码,需要多看多学大牛们...

1444
来自专栏前端真相

为什么数组下标是从0开始?

数组寻址——arr[i] = base_address + i * type_size(1)

2816
来自专栏蓝天

RPC的实现

RPC全称为Remote Procedure Call,即远过程调用。如果没有RPC,那么跨机器间的进程通讯通常得采用消息,这会降低开发效率,也会增加网络...

2123

扫码关注云+社区

领取腾讯云代金券