黑马程序员 java基础之IO总结


 今天复习与总结的内容是IO流对象,对于里面具体的方法我就不写了,我所要总结的主要下面几点:

1.IO流的框架结构
2.对框架中的常用的流对象进行简单总结.
3.与IO相关的一些其它类

先说第1点:框架结构,在JAVA中流按照编码的方式可以分成两个大的类型.既:字节流和字符流.
若按照操作的对象来分又可以分成两大类:读取流和写入流.那么我先来总结一下IO流的大体框架.

从编码的方式来:
字符流: 
写入:Writer 
对文件进行写入的:FileWriter 
加入了缓冲区的:BufferedWriter
用于处理字符数组的:CharArrayWriter
用于进行流转换的: OutputStreamWriter
用于实现管道流的:PipedWriter
用于操作字符串的:StringWriter
用于过滤流中数据的:FilterReader
专注于打印的:PrintWriter
读取:Reader
对文件进行读取的:FileReader
加入了缓冲区的:BufferedReader
用于处理字符数组的:CharArrayReader
用于进行流转换的: InputStreamReader
用于实现管道流的:PipedReader
用于操作字符串的:StringReader
用于过滤流中数据的:FilterWriter
字节流:
读取:InputStream
用于操作文件的:FileInputStream
加入了缓冲区的:BufferedInputStream
用于操作字节数组的:ByteArrayInputStream
用于进行对象序列化的:ObjectInputStream
用于实现管道流的:PipedInputStream
用于过滤流中数据的:FilterInputStream
用于对音频进行处理的:AudioInputStream
用于操作多个流的合并流:SequenceInputStream
写入:OutputStream
用于操作文件的:FileOutputStream
加入了缓冲区的:BufferedOutputStream
用于操作字节数组的:ByteArrayOutputStream
用于进行对象序列化的:ObjectOutputStream
用于实现管道流的:PipedOutputStream
用于过滤流中数据的:FilterOutputStream

至于再下面的子类,可以查看文档.通过这么把它们一列出来,我有一个发现,那就是它们中的输入和输出在大部分情况下是成对出现的.当然
极少的一部分除外,所以接下来对它们进行第2步:简单的总结.
我们先从那极少的一部分说起吧.

PrintWriter,由于我们经常要使用到打印的功能,所以在JDK中专门提供了一个用于打印的流,方便我们对数据进行打印.而对于读取流,
自然就不存在这样的与之对应的类了.用它进行打印确实是一件很舒服的事情,

AudioInputStream:这个是用于专门读取音频文件的类,对它我的了解不多,当我要处理音频文件的时候再仔细的查看文档吧.

SequenceInputStream:它其实是对多个输入流对象进行合并的一种包装流,如果输入流还提供与之对应的对多个输出流进行合并的对象
很显然没有必要了.采用这个流的好处是,可以很方便的把多个流中的数据写入一个流中,毕老师演示过一个把一个文件进行分割的例子.

对于这三个流我所知道的不多,但是它们很显然是很常用的,不然也不至于专门封装成一个对象了.只能在以后的学习中慢慢了解.

其它成对出现的流:
对文件进行操作的:在字符流和字节流中都有出现,我们在选择具体使用哪一个时可以根据文件是否是纯文本来确定.
加入了缓冲区的:和文件流一样,但是它是在读取和写入的时候对其加入了一个缓冲区,以便提高程序的效率.所以如果要提高效率的话选它就没错了
用于实现管道流的:所谓管道流就是把一个输出流和一个输入流进行连通,当程序中有两个流要保持持续的连接时可以使用,但是在创建对象的时候
得注意连接这一步骤.
用于操作数组的:在字符流中,所操作的数组自然应该是字符数组,而在字节流中就是字节数组了,它们提供对数组的方便操作.思想其实就是把数组
看成是一个流.
用于过滤流中的数据的:在一些特定的情况下,我们会对从流中读取到的数据或是写入流中的数据进行修改,这时就是它的用武之地了.
用于进行流转换的:通常情况下是把字节流转换成字符流,以方便我们对数据的操作,而如果把字符流转换成字节流,那么读取或者存入的数据就有
可能出现一些不安全的因素,所以它只是字符流中才有,而在转换是要注意的一点就是字符的编码问题,如果输入流输入时的编码格式和输出
流读取时的格式不同,乱码也就产生了,所以在这里要注意下.
操作字符串的:由于字符串是按字符编码的所以它只出现在字符流中是很容易理解的,它内部提供了对字符串进行操作的很多方便的方法.如果要
操作字符串它会是一个很好的选择.
用于进行对象序列化的:所谓把一个对象进行序列化指的是,把这个对象的二进制表示形式进行存储,以便在程序下次运行时这个对象还能存在,
以达到对象的长久保存,当然,这也就意味着这中间会对这个对象进行编码和解码,所以它们必须是输入流和输出流成对的使用,不然在编码
和解码时就会发生错误.当一个对象需要进行长久存储的时候,就可以使用它们.

经过这么一总结,当下次我想使用流对象的时候就可以根据实际的需要来选择相应的对象了.在这其中还涉及到一个设计模式:包装设计模式.
它的思想就是如果我们发现了一个类的方法不太实用,我们就可以定义一个类,再把这个不太实用的类作为它内部的一个成员,除了提供原有类的
方法以外,另外提供一些更强大的功能,这样做与继承的区别在于,可以减少体系的臃肿.


好吧,现在是第3点:与IO流相关的类.
首先自然是文件类了:
File :它是用来表示一个文件或文件夹对象的,自然的,它内部就会有着一个文件或文件夹所具备的所有的信息.在IO中操作最多的我觉得就是文件了吧.
所以一个流对象通常都会接收一个以File为参数的与之关联的文件或目录.如果是用字符串的形式给出,操作起来就很麻烦,当然也可以做得到,而以File
对象来操作就很方便了,因为它内部提供了大量的方法.它的主要作用就是为我们简化对文件的操作.

另一个比较重要的是与IO相关联的集合类:
Properties:它是Map体系中的,所以在这个集合中,一个元素分别对应着一个键值对的关系,在IO中,我们经常要用到这样的关系,所以为了方便我们的操作
JDK也把这些操作封装成了一个类,让我们可以很方便的把IO与集合相结合,在这个类中,键值对是以"="的形式进行分隔的,当流中涉及到对这样的键值对
进行长久存储的时候用它就是再好不过了.
另外还有一个比较常用的类:随机读写文件
RandomAccessFile:它封装了一组输入输出流在内部,并定义了一个位置指针,我们可以通过这个指针很方便的在流中进行随机的存取操作.

 

 

 

 

posted @ 2013-05-14 22:14  xiewen3410  阅读(148)  评论(0编辑  收藏  举报