IO流

  JAVA中的IO流总结 (转,原味出处 http://blog.csdn.net/yuebinghaoyuan/article/details/7388059)

 

输入输出流是相对于你的程序说的,也就是站在程序的方向看输入还是输出,
例如FileInputStream,Input写入对吧,那么我们站在程序的方向来看,就是源文件指向程序,FileOutputStream,OutPut写出,同理,就是程序指向源文件;
再看,FileWriter,writer写,同理,就是程序指向源文件,反之FileReader读,站在程序角度,就是程序读源文件,顺序就是源文件指向程序

 

Java中的流,可以从不同的角度进行分类。

按照数据流的方向不同可以分为:输入流和输出流。

按照处理数据单位不同可以分为:字节流和字符流。

按照实现功能不同可以分为:节点流和处理流。

 

输出流:

 

 

输入流:

 

因此输入和输出都是从程序的角度来说的。

字节流:一次读入或读出是8位二进制。

字符流:一次读入或读出是16位二进制。

字节流和字符流的原理是相同的,只不过处理的单位不同而已。后缀是Stream是字节流,而后缀是Reader,Writer是字符流。

 

节点流:直接与数据源相连,读入或读出。

 

直接使用节点流,读写不方便,为了更快的读写文件,才有了处理流。

处理流:与节点流一块使用,在节点流的基础上,再套接一层,套接在节点流上的就是处理流。

 

Jdk提供的流继承了四大类:InputStream(字节输入流),OutputStream(字节输出流),Reader(字符输入流),Writer(字符输出流)。

以下是java中io中常用的流。

 

字节输入流:

字节输出流:

字符输入流:

字符输出流:

 

简单介绍其上图:

对文件进行操作:FileInputStream(字节输入流),FileOutputStream(字节输出流),FileReader(字符输入流),FileWriter(字符输出流)

对管道进行操作:PipedInputStream(字节输入流),PipedOutStream(字节输出流),PipedReader(字符输入流),PipedWriter(字符输出流)

PipedInputStream的一个实例要和PipedOutputStream的一个实例共同使用,共同完成管道的读取写入操作。主要用于线程操作。

字节/字符数组:ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter是在内存中开辟了一个字节或字符数组。

Buffered缓冲流::BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,是带缓冲区的处理流,缓冲区的作用的主要目的是:避免每次和硬盘打交道,提高数据访问的效率。

转化流:InputStreamReader/OutputStreamWriter,把字节转化成字符。

数据流:DataInputStream,DataOutputStream。

因为平时若是我们输出一个8个字节的long类型或4个字节的float类型,那怎么办呢?可以一个字节一个字节输出,也可以把转换成字符串输出,但是这样转换费时间,若是直接输出该多好啊,因此这个数据流就解决了我们输出数据类型的困难。数据流可以直接输出float类型或long类型,提高了数据读写的效率。

打印流:printStream,printWriter,一般是打印到控制台,可以进行控制打印的地方。

对象流:ObjectInputStream,ObjectOutputStream,把封装的对象直接输出,而不是一个个在转换成字符串再输出。

序列化流:SequenceInputStream。

对象序列化:把对象直接转换成二进制,写入介质中。

使用对象流需要实现Serializable接口,否则会报错。而若用transient关键字修饰成员变量,不写入该成员变量,若是引用类型的成员变量为null,值类型的成员变量为0.

 

Java IO的一般使用原则:  

  一、按数据来源(去向)分类:  

    1、是文件: FileInputStream, FileOutputStream, FileReader, FileWriter  

    2、是byte[]:ByteArrayInputStream, ByteArrayOutputStream  

    3、是Char[]: CharArrayReader, CharArrayWriter  

    4、是String: StringBufferInputStream, StringReader, StringWriter  

    5、网络数据流:InputStream, OutputStream, Reader, Writer  

二、按是否格式化输出分:  

  1、要格式化输出:PrintStream, PrintWriter  

三、按是否要缓冲分:  

  1、要缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter  

四、按数据格式分:  

  1、二进制格式(只要不能确定是纯文本的): InputStream, OutputStream及其所有带Stream结束的子类  

2、纯文本格式(含纯英文与汉字或其他编码方式);Reader, Writer及其所有带Reader, Writer的子类  

五、按输入输出分:  

  1、输入:Reader, InputStream类型的子类  

  2、输出:Writer, OutputStream类型的子类  

六、特殊需要:  

  1、从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter  

  2、对象输入输出:ObjectInputStream, ObjectOutputStream  

  3、进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter  

  4、合并输入:SequenceInputStream  

  5、更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader  

 

  决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):  

     第一,考虑最原始的数据格式是什么:是否为文本?  

            第二,是输入还是输出?

     第三,是否需要转换流:InputStreamReader, OutputStreamWriter?  

     第四,数据来源(去向)是什么:文件?内存?网络?

     第五,是否要缓冲:bufferedReader (特别注明:一定要注意的是readLine()是否有定义,有什么比read, write更特殊的输入或输出方法)

     第六,是否要格式化输出:print?  

 

posted @ 2015-08-26 17:21  牛肉羊杂汤  阅读(134)  评论(0)    收藏  举报