黑马程序员——Java基础5 io流

来源:互联网 发布:装饰定额预算软件 编辑:程序博客网 时间:2024/06/06 04:06

 ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

1

上篇博客记录学习到了复制的内容,接下来要说的是通过缓冲流复制,这里要介绍一下缓冲流,缓冲流的作用如下:

缓冲流的引入带来的最大的好处就是提高了文件操作的效率,因为如果没有缓冲区,应用程序每次输入(读取)输出(写入)都要和设备进行通信,效率很低,因此缓冲区为了提高效率,数据读写时在内存中为每个流对象提供一个临时缓冲区,每次读取 一个缓冲区大小的数据后再将这些数据一次性写入(输出)到目标设备,字符流底层使用字节流的缓冲区,先将字节读取到缓冲区,然后经过查字符编码表 查到字符才进一步的对字符进行操作。

假如我们要通过一个缓冲区复制一个文本文件,示例代码如下:


这里注意ReadLine方法的原理:无论是读取一行,或者读取多个字符,最终都是在硬盘上一个个读取。所以最终使用的还read方法一个读取一个的方法。


字符流的缓冲区:

缓冲区的出现提高了对数据的读写效率

对应类:

  BufferedWriter

  BufferedReader

缓冲区要结合;流才可以使用。在流的基础上对流的功能进行了增强。


2 装饰设计模式

装饰设计模式的最大作用是对原有类进行了功能的改变和增强。

当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。

那么自定义的该类称为装饰类。装饰类通常会通过构造方法接收被装饰的对象。并基于被装饰的对象的功能,提供更强的功能。

示例如下:


装饰和继承的区别:

装饰设计模式更加的灵活,避免了继承体系的臃肿,降低了类与类之间的联系。装饰类因为是增强已有的对象,具备的功能和已有的是相同的,但是提供了更强的功能, 装饰类和被装饰类通常属于同一体系。


3 字节流File的读写操作

字节流的基本操作和字符流相同,但它不仅可以操作字符,还可以操作其他媒体文件,例如复制一个jpg文件。

思路:

1,用字节读取流对象和图片关联。

2,用字节写入流对象创建一个图片文件。用于存储获取到的图片数据。

3,通过循环读写,完成数据的存储。

4,关闭资源。

字节流的缓冲区,同样是为了提高效率。

4

转换流的由来:

       字符流和字节流之间的桥梁

       方便了字符流和字节流之间的操作

转换流的应用

       字节流中的数据都是字符时,转成字符流操作更高效。

标准输入输出流

System类中的字段:in,out

它们各代表了系统的标准输入和输出设备。

默认输入设备是键盘,输出设备是显示器。

System.in的类型是InputStream

System.out的类型是PrintStream是OutStream的子类  FilterOutputStream的子类


能不能将字节流转成字符流在使用字符流缓冲去的readLine方法呢?


5 流操作的基本规律
流操作的规律很简单,就是要明白源和目的。

    1,明确源和目的。

       源:输入流。InputStream Reader

       目的:输出流。OutputStream Writer。

    2,操作的数据是否是纯文本。

       是:字符流。

       不是:字节流。

     3,当体系明确后,在明确要使用哪个具体的对象。

       通过设备来进行区分:

       源设备:内存,硬盘。键盘

       目的设备:内存,硬盘,控制台。


例如:将一个文本文件中数据存储到另一个文件中。复制文件。

源:因为是源,所以使用读取流。InputStream Reader

       是不是操作文本文件。

       是!这时就可以选择Reader

       这样体系就明确了。

明确设备:硬盘。上一个文件。

       Reader体系中可以操作文件的对象是 FileReader

 

是否需要提高效率:是!。加入Reader体系中缓冲区 BufferedReader.


6 流的应用

流失用来处理数据的

       处理数据时,一定要先明确数据源,与数据目的地

       数据源可以是文件,也可以是键盘

       数据目的地可以是文件,显示器或者其他设备

       而流只是在帮助数据进行数据传输,并对传输的数据进行处理,比如过滤处理、转换处理等。

通过缓冲区复制mp3文件

BufferedOutputStream

BufferedInputStream


7 File类

用来将文件或者文件夹封装成对象;方便对文件与文件夹的属性信息进行操作; File对象可以作文参数传递给流的构造函数。

字符编码

字符流的出现是为了方便操作字符,更重要的是加入了编码转换

通过子类转换流来完成:InputStreamReader/OutputStreamWriter

在两个对象进行构造的时候可以加入字符集。

 

常见的编码表有以下几种

ASCII:美国标准信息交换码,用一个字节的7位表示。

ISO8859-1:拉丁码表,用一个字节的8位表示

GBK:中国的中文码表,相比于GB2312,进行了升级,融合了更多的中文字符。

Unicode:国际标准码,融合了多种文字,所有的文字都用两个字节来表示。

UTF-8:最多用三个字节表示一个字符。

 

转换流的编码应用

可以将字符以指定编码格式存储。

可以对文本数据指定编码格式进行解读。

指定编码表的动作由构造函数完成。

 

字符编码

       编码:字符串-->字节数组

       解码:字节数组-->字符串















0 0