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)