Java的IO流各个类的使用原则

参考:http://blog.csdn.net/ilibaba/article/details/3955799

Java IO 的一般使用原则(花多眼乱,其实每个类都有专门的作用):

这里有详细介绍:Java的IO输入输出流类的介绍(有图)

一、按数据来源(去向,也就是颗粒)分类:

  1 、文件:

             FileInputStream, FileOutputStream, (字节流)

             FileReader, FileWriter(字符流)

  2 、字节数组 byte[]:

            ByteArrayInputStream, ByteArrayOutputStream( 字节流 )

  3 、字符数组 Char[]:

           CharArrayReader, CharArrayWriter( 字符流 )

  4、字符串String:

         StringBufferInputStream,StringBufferOuputStream(字节流)
         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 、从 Stream 到 Reader,Writer 的转换类:

              InputStreamReader, OutputStreamWriter

     2 、对象输入输出:

              ObjectInputStream, ObjectOutputStream

     3 、进程间通信:

              PipeInputStream, PipeOutputStream,(字节流)

              PipeReader, PipeWriter(字符流)

    4 、合并输入:

              SequenceInputStream

    5 、更特殊的需要:

           PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

******************使用原则的步骤*************************************
决定使用哪个类以及它的构造方法的一般准则如下(不考虑特殊需要):

   第一,考虑最原始的数据格式是什么:

          原则四(是二进制文件还是纯文本,直接决定使用字节流还是字符流)

   第二,是否需要转换流:

         原则六第 1 点(字节转字符,字符转字节)

   第三,数据来源(去向)是什么:

        原则一(颗粒:基本单位,是文件,字节数组/字符数组,String,Object)

   第四,是否要缓冲:

      原则三 (特别注明:一定要注意的是 readLine() 是否有定义,有什么比 read, write 更特殊的输入或输出方法,通常多建议使用,可以提高效率

                        普通的InputStream/OutputStream或者Reader/Writer都没有定义readLine()方法也就是不能直接在控制台输出字符串

                        而Buffered缓冲流中有定义readLine(),不过不能自动换行,需要newLine()手动生成;而PrintStream和PrintWriter有println()方法

   第五,是否要格式化输出:(其实就是是否直接输出)

        原则二(PrintStream,PrintWriter)

 

**********************几个例子**********************************

    Java复制文件的简单代码:

1.使用字节流(所有都可以出来)

 1 package iotest;
 2 
 3 import java.io.*;
 4 import java.util.*;
 5 /**
 6  * Java复制文件的简单例子
 7  * */
 8 public class CopyWithoutBuffer {
 9     public static void main(String[] args){
10         long start = System.currentTimeMillis();
11         System.out.println("begin copy....");
12         try {
13             FileInputStream fis = new FileInputStream("E:\\12.mp4");
14             FileOutputStream fos = new FileOutputStream("E:\\123.mp4");
15             //这里使用了缓冲流,使用可以提高效率
16             BufferedInputStream bis = new BufferedInputStream(fis);
17             BufferedOutputStream bos = new BufferedOutputStream(fos);
18             try {
19                 byte[] buf = new byte[1024];
20                 使用buffer
21                 int read = bis.read(buf);
22                 while(read!=-1){
23                     bos.write(buf,0,read);//因为buf读到最后可能不满,所以要以read为准
24                     read = bis.read(buf);
25                 }
26 
27 //                //不使用buff,并不使用byte数组,效率低很多,耗时大
28 //                int read = bis.read();//一次读取一个字节
29 //                while(read!=-1){
30 //                    bos.write(read);
31 //                    read = bis.read();
32 //                }
33                 bos.close();
34                 fos.close();
35                 bis.close();
36                 fis.close();
37             } catch (IOException e) {
38                 e.printStackTrace();
39             }
40             
41         } catch (FileNotFoundException e) {
42             e.printStackTrace();
43         }
44         
45         long end = System.currentTimeMillis();
46         System.out.println("Copy Complete,use times:"+(end-start)+" ms");
47     }
48 
49 }
View Code

2.使用字符流(只能处理纯文本文件(处理起来比字节流快),视频音频会有问题):

 1 package iotest;
 2 
 3 import java.io.*;
 4 
 5 public class IOReaderTest {
 6     public static void main(String[] args) {
 7         System.out.println("开始");
 8         long start = System.currentTimeMillis();
 9         try {
10             FileReader fr = new FileReader("e:\\123.txt");
11             FileWriter fw = new FileWriter("e:\\123456.txt");
12             /*
13             BufferedReader br = new BufferedReader(fr);
14             String abc = br.readLine();//BufferedReader才定义了readLine()方法
15             //如果要换行,需要br.newLine()手动生成
16             System.out.println(abc);
17             */
18             int read = fr.read();
19             while(read!=-1){
20                 fw.write(read);
21                 read = fr.read();
22             }
23             fw.close();
24             fr.close();
25             long end = System.currentTimeMillis();
26             System.out.println("耗时:"+(end-start)+" ms");
27         } catch (FileNotFoundException e) {
28             e.printStackTrace();
29         } catch (IOException e) {
30             e.printStackTrace();
31         }
32 
33     }
34 
35 }
View Code

 

你可能感兴趣的:(Java的IO流各个类的使用原则)