Java基礎——iO(一),java基礎io
此文為瞭解IO知識的基礎篇,這塊我看了幾天,感覺和前段時間學習集合一樣,零散又重要。想記錄一下這塊由淺入深的學習過程。所以,接下來會記錄幾篇學習筆記,之後會有以前深入總結。因為這塊比較重要啊,所以一定要學好。
一、IO的概述
IO: (Input Output)
--- 什麼是流:
一組有順序的、有起點和終點的資料集合,如檔案流、網路流
--- 流與檔案的區別:
檔案是資料的靜態儲存方法。流是資料在傳輸時的一種形態。
java 對資料的操作都是通過流的方式,java 用於操作流的對象都在IO包中。
流按操作資料分為:
位元組流(InputStream、OutputStream) 和 字元流(Reader、Writer)
其他所有的IO操作的類都是有它 們派生出來的
凡是屬於位元組流的 都是以 InputStream , OutputStream 為結尾,比如 FileInputStream, FileOutputStream 等
凡是屬於字元流的,都是以 Reader , Writer 為結尾 比如 FileReader, PrintWriter 等
流按流向分為:
輸入資料流和輸出資料流
二、字元流 Writer
字元流的結構(只以輸出資料流為例)
Writer -- BufferedWriter
CharArrayWriter
OutputStreamWriter --FileWriter
FilterWriter //過濾流
PipedWriter //管道流
StringWriter
//例一 建立一個檔案,寫入一些內容 static void test() throws IOException{ Writer wr=new FileWriter("c:/1.txt"); //把原來的內容覆蓋了 wr.write("這是一行文本"); wr.write("\r\n"); //寫入分行符號 wr.write("這是第二行文本"); //寫到緩衝區中了 wr.flush(); //重新整理緩衝區 wr.close(); //流使用完,一定要關閉 } //FileWriter(String fileName, boolean append) static void test2()throws IOException{ Writer wr=new FileWriter("c:/1.txt",true); //可以給第二個參數傳true,表示以追回的方式寫入 wr.write("這是追加方式寫入的內容"); //wr.flush(); 有下面的close,這裡不flush也可以 wr.close(); }
三、標準的IO異常處理
程式碼範例:
import java.io.FileWriter;import java.io.IOException;import java.io.Writer;import java.util.ArrayList;import java.util.List;//把一份名單寫入檔案class Test16 { public static void main(String[] args) { List<String> nameList = new ArrayList<String>(); nameList.add("PHP"); nameList.add("Java"); nameList.add("C#"); nameList.add("C++"); Writer wr = null; try { wr = new FileWriter("名單.exe"); for (String name : nameList) { wr.write(name + "\r\n"); } } catch (Exception ex) { throw new RuntimeException(ex); } finally { try { if (wr != null) { wr.close(); } } catch (IOException ex) { throw new RuntimeException(ex); } } }}// 關鍵點,要在finally 中關閉資源,關閉的時候,不要忘了判斷這個資源是不是null
四、字元流 Reader
//例子,從檔案中讀取資料
int read() 讀取單個字元 //返回的是這個字元的編碼值
int read(char[] cbuf) 將字元讀入數組 //傳回值是讀到的字元個數,如果讀到了末尾,返回-1(-1這個性質經常用到)
int read(char[] cbuf, int off, int len) 將字元讀入數組的某一部分。
//從檔案讀取資料 (本例是一個字元一個字元的方式讀的)static void test4() throws IOException { Reader r=new FileReader("C:/名單.txt"); int ch=0; while(( ch=r.read()) !=-1 ){ System.out.println((char)ch); } }
//從檔案讀取資料 ,做為了一個符串列印出來 static void test5() throws IOException { Reader r=new FileReader("C:/1.txt"); char [] buff=new char[1024]; int count=r.read(buff); String str=new String(buff,0,count); System.out.println(str); r.close(); }
//例子 檔案複製 ,把C盤上的某個檔案複製到E盤
//這樣的複製是將字元一個一個的複製,很顯然,它的效率比較低!
Reader r=new FileReader("E:\\FristOne\\src\\MyProject.java");//注意:路徑的反斜線要用轉義 Writer w=new FileWriter("E:\\desc.txt"); int ch=0; while( (ch= r.read())!=-1 ){ w.write(ch); } r.close(); w.close()
既然,有一個一個的複製,我們會想,怎麼樣才能讓複製的效率變得更加高效呢?
我們可以定義一個容器,用它去塊一塊的去複製,效率就會更高了。下面是圖形說明:
程式碼範例:
Reader r=new FileReader("E:\\FristOne\\src\\MyProject.java"); Writer w=new FileWriter("E:\\desc.txt"); char [] buff=new char[1024];//定義一個容器 //定義容器之後,會發生一些情況,比如取了幾次以後,剩下部分的容量少於定義的容器的容量,這時候讓它再去一次勢必會有空餘的空間被佔位。這不是我們想要的,所以就引出下面這個含參的取法。 int len=0; while( (len= r.read(buff))!=-1 ){ w.write(buff,0,len); } r.close(); w.close();
關於IO的知識確實蠻多的,下篇待續咯......