黑马程序员——java IO流

来源:互联网 发布:看图猜成语软件 编辑:程序博客网 时间:2024/04/30 04:13
                ------------------ android培训java培训期待与您交流! ----------

//=====================================================================
//@TITLE:
//    java IO流
//@AUTHOR:
//    Benwolf
//@DATE:
//    Tuesday  26-April-2013
//=====================================================================

一、java中为什么要有IO流,它是用来做什么的?
  IO流:主要用来操作设备上的数据。比如用java程序复制文件、用程序将数据录入到文件中都用到了IO流。
二、IO流具体的分类


  1.按操作数据来分:
   <1>字符流:
    字符流的由来:
     因为文件的编码不同,从而有了对字符进行高效操作的字符流对象。
     原理:其实就是基于字节流读取字节时,去查了指定的编码表:也就是:字符流 = 字节流 +编码表
   <2>字节流:
    字节流在读取的时候,读到一个字节返回一个字节。它可以操作任何类型的数据。比如“mp3文件、音频文件、视频文件、文本文件。”
  2.按流向分:
   <1>输入流:
   <2>输出流:
  3.字符流与字节流的区别:
   <1>字节流只能读取一个字节,而字符流可以读取一个字符或多个字符。
   <2>字节流可以操作任何文件,字符流只能操作文本文件。

三、IO的体系:
  IO所具备最基本的功能就是"读和写"。
   1.字符流
    Reader<读>   Writer<写>
   2.字节流
    InputStream<读>  OutPutStream<写>
  注意:在操作IO流数据的时候,分清2个明确就可以。
      A: 明确操作数据源和目的地体系
   1、明确数据源
    从数据源是读取数据
    InPutStream
    Reader
   2、明确目的地
    把数据写入目的地
    OutPutStream
    Writer

      B: 明确具体的数据源和目的地是否是文本文件
   1、明确数据源
    是文件: 用Reader
    不是文件: InputStream
    
   2、明确目的地
    写入的目的地是否是文件,如果是: 用Wrtier
    如果不是文件: 用OutPutStream
四:IO流的使用步骤:
  1.先明确数据源和目的地
  2.封装数据源和目的地
  3.调用流对象的方法
  4.释放资源。

五:在操作IO流遇到的一些问题:
  1.什么时候需要用到转换流?
   在操作字节流数据的时候,为了使用高效字符流的一些方法需要把字节流进行转换,这个时候java就提供了转换流。
   (InputStreamReader:字节流转换成字符流
     OutPutStreamWriter:字符流转换成字节流)

  2.在创建字符输出流对象做了几件事?
   三件事:1.创建文件对象  2.创建输出流对  3.输出流指向文件对象。

  3.为什么一定要释放资源?
   1.让对象变成垃圾  2.通知操作系统释放被占用的资源。

  4.flush方法和close方法的区别?
   flush方法:刷新缓冲区后,还可以继续使用流对象
   close方法:是在关闭流之前先进行的刷新动作,关闭流后,对象不能使用,变成垃圾了。

六:IO流的一些实例:

                  字符流实例1:

[java] view plaincopy
  1.                      /* 
  2.               * 把d盘目录下的a.txt复制到e盘下的b.txt中,并加入异常处理。 
  3.               */  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileReader;  
  6. import java.io.FileWriter;  
  7. import java.io.IOException;  
  8.     public class CopyTest {  
  9.     public static void main(String[] args) {  
  10.         FileReader fr = null;  
  11.         FileWriter fw = null;  
  12.         try {  
  13.             // 字符输入流封装数据源  
  14.             fr = new FileReader("d:\\a.txt");  
  15.             // 字符输出流封装目的地  
  16.             fw = new FileWriter("e:\\b.txt");  
  17.   
  18.             // 基本读写  
  19.             int ch = 0;  
  20.             while ((ch = fr.read()) != -1) {  
  21.                 fw.write(ch);  
  22.                 // fw.flush();  
  23.             }  
  24.   
  25.         } catch (IOException ie) {  
  26.             ie.printStackTrace();  
  27.         } finally {  
  28.             // 释放资源  
  29.             if (fw != null) {  
  30.                 try {  
  31.                     fw.close();  
  32.   
  33.                 } catch (IOException e) {  
  34.                     e.printStackTrace();  
  35.                 }  
  36.             }  
  37.             if (fr != null) {  
  38.                 try {  
  39.                     fr.close();  
  40.                 } catch (IOException e) {  
  41.                     e.printStackTrace();  
  42.                 }  
  43.             }  
  44.         }  
  45.           
  46.           
  47.     }  
  48. }  

                            字节流实例2:

[java] view plaincopy
  1. /** 
  2.       *测试字节流的复制mp3所用的时间: 
  3.       * 
  4.       */  
  5.   
  6. import java.io.BufferedInputStream;  
  7. import java.io.BufferedOutputStream;  
  8. import java.io.FileInputStream;  
  9. import java.io.FileOutputStream;  
  10. import java.io.IOException;  
  11. public class CopyMP3 {  
  12.     public static void main(String[] args) throws IOException {  
  13.         long start = System.currentTimeMillis();  
  14.         method();  
  15.         long end = System.currentTimeMillis();  
  16.         System.out.println("共耗时:" + (end - start) + "毫秒");  
  17.     }  
  18.   
  19.     // 高效的一次读写一个字节  
  20.     private static void method() throws IOException {  
  21.         //创建字节输入流对象  
  22.         BufferedInputStream bis = new BufferedInputStream(new FileInputStream(  
  23.                 "zxmzf.mp3"));  
  24.         //创建字节输出流对象  
  25.         BufferedOutputStream bos = new BufferedOutputStream(  
  26.                 new FileOutputStream("method4.mp3"));  
  27.         //定义缓冲区  
  28.         byte[] bys = new byte[1024];  
  29.         int len = 0;  
  30.         //调用输入流方法  
  31.         while((len=bis.read(bys))!=-1){  
  32.             bos.write(bys,0,len);  
  33.         }  
  34.         //释放资源  
  35.         bos.close();  
  36.         bis.close();  
  37.     }  
  38. }  

                            转换流实例3:

[java] view plaincopy
  1. /** 
  2.       *把键盘录入的数据,转成大写通过标准流显示在控制台。 
  3.       * 
  4.       */  
  5. import java.io.BufferedReader;  
  6. import java.io.BufferedWriter;  
  7. import java.io.IOException;  
  8. import java.io.InputStreamReader;  
  9. import java.io.OutputStreamWriter;  
  10. public class SystemOutDemo2 {  
  11.     public static void main(String[] args) throws IOException {  
  12.         // 封装数据源和目的地  
  13.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
  14.         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));  
  15.           
  16.         //基本读写操作  
  17.         String line=  null;  
  18.         while((line=br.readLine())!=null){  
  19.             //数据源是键盘录入的时候,一定要自定义结束标记  
  20.             if("886".equals(line)){ //==  
  21.                 break;  
  22.             }  
  23.             bw.write(line.toUpperCase());  
  24.             bw.newLine();  
  25.             bw.flush();  
  26.         }  
  27.         //释放资源  
  28.         bw.close();  
  29.         br.close();  
  30.     }  
  31. }  


上述总结:
  实例1:当数据源和目的地的操作的数据是文本文件的时候,用字符流是最高效。
  实例2:高效字节流,之所以高效是因为每次读取字节的时候,都将数据存在了缓冲区。在写入的时候从缓冲区写入,提高了效率
  实例3:当从键盘录入和控制台结束的时候,需要定义标记。因为控制台录入的都是字节和字符,所以需要用到了转换流,转换成字符流,并使用它的高效方法。


原创粉丝点击