天天看点

Java中的那些“流”之JAVA基础知识之我的理解8

IO里的那些流

今天做一个”流”的总结,那些”流”呢,当然是IO里的那些流.

既然做流,我们就先明确一个概念,即什么是流?

流的概念

在Java中,把一组有序的数据序列称为流.

流的分类:

流按方向分为两种:输入流和输出流.程序向输入流读取数据,向输出流写入数据

输入流:可以从中读取一系列字节的对象称为输入流.

输出流:可以从中写入一系列字节的对象称为输出流.

按照数据流最小数据单元类型分:

1)      数据流最小数据单元为字节,那么这种流叫字节流.

2)      数据流最小数据单元为字符,那么这种流叫字符流.

3)      数据源包括:字节数组,String对象,文件,管道等.(这些名字后面加个流字就可以归为这一类)

流还可以分为:节点流类和过滤流类

这里主要分享一下缓冲流(BufferedInputStream,BufferedOutputStream),他将字节流变成缓冲字节流,这样做最大的优点在于大大提高了性能。当从字节输入流用read()操作,它会一次性读取多个字节来填充内部缓冲,这样就大大减少了程序执行时间。(where还试验了一下,同样一个10MB的文件用缓冲读只需3ms而用数组及时把数组大小设置成10000仍需350多ms,而且用数组复制的话很难百分之百复制,总会多出一些字节,者难以避免,所以在此推荐用缓冲流)

PS:默认缓冲区大小事8192字节,可以将缓冲区设定为内存页或磁盘块的整数倍来提高性能。

PPS:在关闭缓冲流时会自动关闭所串接的底层字节流

流的应用

看了这么多流的分类,我们会有个疑问,“这么多流”我们在那种情况下用何钟流?下面就我现在所知,做一个总结。

1)       如果我们要从数据流中读取(写入)指定数据类型的数据,如int,float型的数值,只要用DateInputStream/DateOutputStream

2)       如果我们要将一个对象从数据流中读取(写入)文件,只要用ObjectInputStream/ObjectOutputStream.

3)       FileInputStream/FileOutputStream,用于从文件读取(写入)数据,主要用于二进制文件的读/写(如读取图像之类的原始字节流)

4)       在分类时我们提到了数据源,当你要写如数组时,按照上面三规律,我们肯定要用ByteArrayOutputStream.写到这我想用法我们基本清楚了。下面我把每一个数据源

FileIputStream
ByteArrayIputStream
FilterIputStream
ObjectIputStream
PipedIputStream
SequenceIputStream

5)       相应的子类做一个列举:

InputStream
DateIputStream
BufferdIputStream
LineNumberIputStream
PushbackIputStream

6)关于每个类的构造方法JDK文档都有不再赘述

流的一些注意事项

1)每次用完流要记着close(),因为如果不关闭它会一直存在与内存。

2)常用的关闭流的顺序是先关输入流,然后强制输出,最后关闭输出流

3)在关闭缓冲流时会自动关闭所串接的底层字节流

4)用什么方法read就用同样的方法write(每个流都有很多read和write方法)用的时候要注意。

“流”的事咱先说到这儿,当前也就想到这么多,本来想贴画图板的保存和打开作为流的应用举例,耐于篇幅巨大,只能按文件上传上去,有需要的自行下载。(大家可能说where你这老拿画图板说事,没有一个功能相对完善,界面相对漂亮的画图板,面对这种声音where只能说电脑坏了以后原来做的相对完整的画图板不能用了,于是每次用的画图板都比较粗糙,只实现了相应知识点的功能,当然这样也有好处,对于像where一样的初学者想单看某个功能的实现,这样也方便些,仅作学习之用,特此解释,不过只要时间允许where还是会做一个相对完整的画图板)