java中的IO操做总结(一)

  所谓IO,也就是InputOutput的缩写。在java中,IO涉及的范围比较大,这里主要讨论针对文件内容的读写
其余知识点将放置后续章节(我想,文章太长了,谁都没耐心翻到最后)
对于文件内容的操做主要分为两大类
分别是:
  字符流
  字节流
其中,字符流有两个抽象类:Writer ,Reader
其对应子类FileWriter和FileReader可实现文件的读写操做
BufferedWriter和BufferedReader可以提供缓冲区功能,用以提升效率
 
一样,字节流也有两个抽象类:InputStream   OutputStream
其对应子类有FileInputStream和FileOutputStream实现文件读写
BufferedInputStream和BufferedOutputStream提供缓冲区功能
 
俺当初学IO的时候犯了很多迷糊,网上有些代码也没法经过编译,甚至风格都很大不一样,因此新手请注意:       
        1.本文代码较长,不应省略的都没省略,主要是由于做为一个新手须要养成良好的代码编写习惯
   2.本文在linux下编译,相似于File.pathSeparator和File.separator这种表示方法是出于跨平台性和健壮性考虑
   3.代码中有些操做有多种执行方式,我采用了方式1...方式2...的表述,只需轻轻解开注释即可编译
   4.代码中并无在主方法上抛出异常,而是分别捕捉,形成代码过长,若是仅是测试,或者不想有好的编程习惯,那你就随便抛吧……
        5.功能相似的地方就没有重复写注释了,若是新手看不懂下面的代码,那确定是上面的没有理解清楚
 
字符流
实例1:字符流的写入

    
    
    
    
  1. import java.io.File; 
  2. import java.io.FileWriter; 
  3. import java.io.IOException; 
  4.   
  5. public class Demo { 
  6.     public static void main(String[] args ) { 
  7.           
  8.         //建立要操做的文件路径和名称 
  9.         //其中,File.separator表示系统相关的分隔符,Linux下为:/  Windows下为:\\ 
  10.         String path = File.separator + "home" + File.separator + "siu" +  
  11.                       File.separator + "work" + File.separator + "demo.txt"
  12.       
  13.         //因为IO操做会抛出异常,所以在try语句块的外部定义FileWriter的引用 
  14.         FileWriter w = null
  15.         try { 
  16.             //以path为路径建立一个新的FileWriter对象 
  17.             //若是须要追加数据,而不是覆盖,则使用FileWriter(path,true)构造方法 
  18.             w = new FileWriter(path); 
  19.               
  20.             //将字符串写入到流中,\r\n表示换行想有好的 
  21.             w.write("Nerxious is a good boy\r\n"); 
  22.             //若是想立刻看到写入效果,则须要调用w.flush()方法 
  23.             w.flush(); 
  24.         } catch (IOException e) { 
  25.             e.printStackTrace(); 
  26.         } finally { 
  27.             //若是前面发生异常,那么是没法产生w对象的  
  28.             //所以要作出判断,以避免发生空指针异常 
  29.             if(w != null) { 
  30.                 try { 
  31.                     //关闭流资源,须要再次捕捉异常 
  32.                     w.close(); 
  33.                 } catch (IOException e) { 
  34.                     e.printStackTrace(); 
  35.                 } 
  36.             } 
  37.         } 
  38.     } 
编译以后,在目录下面生成文件,并写入字符串
 

实例2:字符流的读取
 

    
    
    
    
  1. import java.io.File; 
  2. import java.io.FileReader; 
  3. import java.io.IOException; 
  4.   
  5. public class Demo2 { 
  6.     public static void main(String[] args ) { 
  7.         String path = File.separator + "home" + File.separator + "siu" +  
  8.                       File.separator + "work" + File.separator + "demo.txt"
  9.   
  10.         FileReader r = null
  11.         try { 
  12.             r = new FileReader(path); 
  13.               
  14.             //方式一:读取单个字符的方式 
  15.             //每读取一次,向下移动一个字符单位 
  16.             int temp1 = r.read(); 
  17.             System.out.println((char)temp1); 
  18.             int temp2 = r.read(); 
  19.             System.out.println((char)temp2); 
  20.                           
  21.             //方式二:循环读取 
  22.             //read()方法读到文件末尾会返回-1 
  23.             /* 
  24.             while (true) { 
  25.                 int temp = r.read(); 
  26.                 if (temp == -1) { 
  27.                     break; 
  28.                 } 
  29.                 System.out.print((char)temp); 
  30.             } 
  31.             */ 
  32.               
  33.             //方式三:循环读取的简化操做 
  34.             //单个字符读取,当temp不等于-1的时候打印字符 
  35.             /*int temp = 0; 
  36.             while ((temp = r.read()) != -1) { 
  37.                 System.out.print((char)temp); 
  38.             } 
  39.             */ 
  40.               
  41.             //方式四:读入到字符数组 
  42.             /* 
  43.             char[] buf = new char[1024]; 
  44.             int temp = r.read(buf); 
  45.             //将数组转化为字符串打印,后面参数的意思是 
  46.             //若是字符数组未满,转化成字符串打印后尾部也许会出现其余字符 
  47.             //所以,读取的字符有多少个,就转化多少为字符串 
  48.             System.out.println(new String(buf,0,temp)); 
  49.             */ 
  50.               
  51.             //方式五:读入到字符数组的优化 
  52.             //因为有时候文件太大,没法肯定须要定义的数组大小 
  53.             //所以通常定义数组长度为1024,采用循环的方式读入 
  54.             /* 
  55.             char[] buf = new char[1024]; 
  56.             int temp = 0; 
  57.             while((temp = r.read(buf)) != -1) { 
  58.                 System.out.print(new String(buf,0,temp)); 
  59.             } 
  60.             */ 
  61.               
  62.         } catch (IOException e) { 
  63.             e.printStackTrace(); 
  64.         } finally { 
  65.             if(r != null) { 
  66.                 try { 
  67.                     r.close(); 
  68.                 } catch (IOException e) { 
  69.                     e.printStackTrace(); 
  70.                 } 
  71.             } 
  72.         } 
  73.     } 
编译以后的效果:

 
实例3:文本文件的复制
    
    
    
    
  1. import java.io.File; 
  2. import java.io.FileReader; 
  3. import java.io.FileWriter; 
  4. import java.io.IOException; 
  5.   
  6. public class Demo { 
  7.     public static void main(String[] args ) { 
  8.           
  9.         String doc = File.separator + "home" + File.separator + "siu" +  
  10.                       File.separator + "work" + File.separator + "demo.txt"
  11.           
  12.         String copy = File.separator + "home" + File.separator + "siu" +  
  13.                      File.separator + "life" + File.separator + "lrc.txt"
  14.   
  15.         FileReader r = null
  16.         FileWriter w = null
  17.         try { 
  18.             r = new FileReader(doc); 
  19.             w = new FileWriter(copy); 
  20.               
  21.             //方式一:单个字符写入 
  22.             int temp = 0
  23.             while((temp = r.read()) != -1) { 
  24.                 w.write(temp); 
  25.             } 
  26.               
  27.             //方式二:字符数组方式写入 
  28.             /* 
  29.             char[] buf = new char[1024]; 
  30.             int temp = 0; 
  31.             while ((temp = r.read(buf)) != -1) { 
  32.                 w.write(new String(buf,0,temp)); 
  33.             } 
  34.             */ 
  35.               
  36.         } catch (IOException e) { 
  37.             e.printStackTrace(); 
  38.         } finally { 
  39.             //分别判断是否空指针引用,而后关闭流 
  40.             if(r != null) { 
  41.                 try { 
  42.                     r.close(); 
  43.                 } catch (IOException e) { 
  44.                     e.printStackTrace(); 
  45.                 } 
  46.             } 
  47.             if(w != null) { 
  48.                 try { 
  49.                     w.close(); 
  50.                 } catch (IOException e) { 
  51.                     e.printStackTrace(); 
  52.                 } 
  53.             } 
  54.         } 
  55.     } 
 
 
实例4:利用字符流的缓冲区来进行文本文件的复制
 

    
    
    
    
  1. import java.io.BufferedReader; 
  2. import java.io.BufferedWriter; 
  3. import java.io.File; 
  4. import java.io.FileReader; 
  5. import java.io.FileWriter; 
  6. import java.io.IOException; 
  7.   
  8. public class Demo { 
  9.     public static void main(String[] args ) { 
  10.           
  11.         String doc = File.separator + "home" + File.separator + "siu" +  
  12.                       File.separator + "work" + File.separator + "demo.txt"
  13.           
  14.         String copy = File.separator + "home" + File.separator + "siu" +  
  15.                      File.separator + "life" + File.separator + "lrc.txt"
  16.   
  17.         FileReader r = null
  18.         FileWriter w = null
  19.         //建立缓冲区的引用 
  20.         BufferedReader br = null
  21.         BufferedWriter bw = null
  22.         try { 
  23.             r = new FileReader(doc); 
  24.             w = new FileWriter(copy); 
  25.             //建立缓冲区对象 
  26.             //将须要提升效率的FileReader和FileWriter对象放入其构造函数内 
  27.             //固然,也能够使用匿名对象的方式 br = new BufferedReader(new FileReader(doc)); 
  28.             br = new BufferedReader(r); 
  29.             bw = new BufferedWriter(w); 
  30.               
  31.             String line = null
  32.             //读取行,直到返回null 
  33.             //readLine()方法只返回换行符以前的数据 
  34.             while((line = br.readLine()) != null) { 
  35.                 //使用BufferWriter对象的写入方法 
  36.                 bw.write(line); 
  37.                 //写完文件内容以后换行 
  38.                 //newLine()方法依据平台而定 
  39.                 //windows下的换行是\r\n 
  40.                 //Linux下则是\n 
  41.                 bw.newLine(); 
  42.             }        
  43.               
  44.         } catch (IOException e) { 
  45.             e.printStackTrace(); 
  46.         } finally { 
  47.             //此处再也不须要捕捉FileReader和FileWriter对象的异常 
  48.             //关闭缓冲区就是关闭缓冲区中的流对象 
  49.             if(br != null) { 
  50.                 try { 
  51.                     r.close(); 
  52.                 } catch (IOException e) { 
  53.                     e.printStackTrace(); 
  54.                 } 
  55.             } 
  56.             if(bw != null) { 
  57.                 try { 
  58.                     bw.close(); 
  59.                 } catch (IOException e) { 
  60.                     e.printStackTrace(); 
  61.                 } 
  62.             } 
  63.         } 
  64.     } 
相关文章
相关标签/搜索