参考: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 }