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.     } 
 
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章