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