java.io包初探

首先: “流”的理解:

       在JAVA中,一组有序的数据序列称为“流”,流分为输入流和输出流两种!

 JAVA的IO系统负责的就是程序的输入和输出

   IO流: 1:字节流    java.io.InputStream  /  java.io.OutputStream

              2:字符流    java.io.Reader   /  java.io.Writer

 

     字节流是最基本的单位,字节流主要是用在二进制数据。 字符流是基础与字节流之上,处理UNICODE数据。也就是说字符流是字节流的封装。在应用上二者的目标也各不相同,字节流可以处理所有的数据,但是字符流只能处理字符数据,一个很明显的例子,如果使用字符流去Copy一张图片,或者一首歌曲,那么这张图片或者这首歌曲的大小会发生变化,同时,文件将变得不可用,而字节流不存在这个问题。

     这时候另一个问题也显示出来,字符流是将字节流包装起来,内部存在字符与字节的转换,那就涉及到编码的问题,如果在不同的编码环境中使用字符流,那么很可能就出来的是乱码,而字节流不存在这个问题,因为它是用的二进制编码,不涉及编码和解码的问题。

 

对于字符流和字节流的操作效率上,是众说纷纭,有人说字符流涉及到对字节流的封装,涉及到包装的问题,因此效率要低于字节流,还有种说法是字符流一次读一个字符,比字节流多读一倍,因此字符流效率高于字节流。

在Copy一个33M的文本文件时FileInputStream花了:184641ms,而对应的FileReader则是用了11969ms,因此可以看出,在文本文件的处理上,字符流效率要高的多,而且在使用的时间上,几乎是前者的60%左右。

 

字节流类关系:  

      InputStream :抽象类,是所有字节输入流的超类

             子类: ByteArrayInputStream: 把字节数组转换为输入流,把内存中的一个缓冲区作为InputStream  使用

                       FileInputStream          : 从文件中读取数据,把一个文件作为InputStream,实现对文件的读取操作

                       PipedInputStream    : 连接一个PipedInputStream,实现了pipe的概念,主要在线程中使用

                       SequenceInputStream : 把几个输入流转换为一个输入流,把多个InputStream合并为一个InputStream

                       ObjectInputStream         :对象输入流

                       FilterInputStream         :装饰器,具有扩展其他输入流的功能

      OutputStream:抽象类,是所有字节输出流的超类

             子类: ByteArrayOutputStream : 向字节数组(内存的缓冲区)中写数据,把信息存入内存中的一个缓冲区中
                       FileOutputStream           :向文件中写数据,把信息存入文件中
                       PipedInputStream         :向管道中输出数据,与PipedInputStream搭配使用,实现了pipe的概念,主要在线程中使用

                       ObjectOutputStream      :对象输出流

                       FilterOutputStream         :装饰器,扩展其他输出流的功能

字符类关系流:   (处理字符流最大的问题是进行字符编码的转换)

      Reader :  读取字符流的抽象类

              子类:CharArrayReader : 适配器,把字符数组转换为Reader,从字符数组中读取字符,与ByteArrayInputStream对应

                       BufferedReader : 装饰器,为其他的Reader提供缓冲区。

                       LineNumberReader:装饰器,为其他的Reader提供缓冲区,并且可以跟踪字符输入流中的行号

                       StringReader     :  适配器,把字符串转换为Reader,从字符串中读取字符

                       PipedReader     :连接一个PipedWriter

                       FilterReader      : 装饰器,扩展其他的Reader的功能

                       InputStreamReader : 适配器,把InputStream转换为Reader,可以指定数据源的字符编码

                       FileReader               : 从文件中读取字符

      Writer :   写入字符流的抽象类

            子类:  CharArrayWriter : 适配器,把字符数组转换为Witer,向字符数组中写字符

                       BufferedWriter    ; 装饰器,为其他的Writer提供写缓冲区

                       StringWriter        :适配器,把StringBuffer转换为Writer,向StringBuffer中写字符

                       PipedWriter        :连接一个PipedReader

                       FilterWriter         :装饰器,扩展其他的Writer的功能

                       PringWriter         :装配器,输出格式化数据

                       OutputStreamWriter   : 适配器,把OutputStream 转换Writer ,可以指定数据汇的字符编码

                       FileWriter              : 向文件中写字符

 最后说下一个比较特殊的类File类,这个类虽然在IO包中,但是不涉及流操作,而且,这个类不涉及文件的内容,它所关心的是文件的本体,封装了对用户机器的文件系统进行操作的功能。虽然字符流和字节流都可以在构造函数直接打开文件,但是使用FILE类去操作文件会更可靠

你可能感兴趣的:(Java技术)