一,IO流的分類java
A,按照操做的對象不一樣可分爲字節流與字符流數組
B,按照流的方向不一樣可分爲輸入(指從外部存儲設備拿文件到內存)流也叫讀與輸出(指從內存把文件寫入到外部存儲設備)流也叫寫緩存
注:字節流能夠操做任何類型的文件,字符流是後來纔出現的,主要用來操做字符類的文件;字符流的出現源於編碼表的問題,一開始計算機內使用ANSII編碼,後來每種語言都有了本身的編碼方式即編碼表,爲了統一這些編碼信息國際標準化組織便產生了Unicode編碼信息表來把世界各國的語言都包括在內,此編碼表採用兩個字節即16位來存儲每個字符,java內置的編碼表即是Unicode編碼;字符流是當讀取文件的時候,以字節的形式讀取後,查詢編碼表看具體使用哪一種編碼方式,查到之後再進行文件的輸出,因此字符流是字節流+查編碼表的封裝形式。ide
二,流的頂層基類函數
全部流的操做無非兩種形式:讀與寫;因此Java便所這兩種操做形式抽取出了字節流與字符流的兩種頂層的基類編碼
字節流的頂層基類:InputStream與OutputStreamcode
字符流的頂層基類:Read與Write對象
三,字符流FileWriter繼承
複製代碼
1 public static void function_demo1() throws IOException {
2 // 建立字符寫入流對象,接收一個要寫入的文件路徑對象,此文件若不存在則新建立一個文件,若已存在則覆蓋的文件
3 FileWriter fw = new FileWriter("demo1.txt");
4 fw.write("abcdefg");// 把內容寫入緩衝區
5 fw.flush();// 從緩衝區把內容刷入文件中
6 fw.close();// 關閉流
7 }
複製代碼
注:以上代碼中fw.flush()是把內容從緩衝區刷入到文件中去,可是fw.close()方法是先把內容從緩衝區刷入到文件中去即先調用flush方法,因此fw.flush()能夠不用
FileWrite在寫時的換行與續寫
複製代碼
1 // 獲取系統換行的符號
2 private static final String LINE_SEPARATOR = System.getProperty("line.separator");
3 public static void function_demo2() throws IOException {
4 FileWriter writer = new FileWriter("demo.txt", true);// 建立寫入流對象
5 // 把內容寫入到緩衝區
6 writer.write("abcdef綿" + LINE_SEPARATOR + "中國人啊吼叫職了");
7 // 把緩衝區裏的內容刷入到文件系統中
8 // writer.flush();
9 // 關閉流,在關閉以前會先把緩衝區裏的內容刷入到文件系統而後才關閉流;若用此關閉流可不用手動調用flush
10 writer.close();
11 }
複製代碼
注:FileWriter在支持續寫的時候提供了一個帶兩個參數的構造函數,當傳遞爲true時便可支持續寫;換行可調用系統提供的換行符號內存
四,字符流FileReader
複製代碼
1 public static void function_demo3() throws IOException {
2 // 建立讀取流對象,指定須要讀取的文件地址
3 FileReader reader = new FileReader("demo.txt");
4 // 聲明一個變量接收讀取到的字符
5 int ch;
6 // 調用read方法讀取文件中的字符,當讀取到文件的末尾的時候read方法返回-1
7 while ((ch = reader.read()) != -1) {
8 System.out.println((char) ch);
9 }
10 // 關閉流
11 reader.close();
12 }
複製代碼
注:此讀取方式爲一個字符的讀取,每讀取一個字符便寫到控制檯,如下代碼演示高效的讀取,即聲明一個緩衝區的數組,把每次所讀到的內容先放入緩衝數組中去,而後再一次性寫到文件中
複製代碼
1 public static void function_demo4() throws IOException {
2 //讀取流對象
3 FileReader reader = new FileReader("demo.txt");
4 //每次讀取到的字符放入的緩衝數組區
5 char[] buf = new char[1024];
6 //每次讀取到的字符數
7 int i;
8 //循環讀取,每次read一次把讀取到的內容放入buf字符數組,讀到最後會返回-1
9 while ((i = reader.read(buf)) != -1) {
10 //把讀取到的字符轉爲字符串,每次轉換的數量爲讀取到的字符數
11 System.out.println(new String(buf, 0, i));
12 }
13 reader.close();
14 }
複製代碼
下面用兩種方式實現文件的複製功能
複製代碼
private static void function_demo5() throws IOException {
FileReader fr = new FileReader("demo.txt");//建立讀取流對象
FileWriter fw = new FileWriter("demo2.txt");//建立寫入流對象,若文件不存在則建立;若存在則覆蓋
int ch;//存儲讀取到的字符
//循環讀取文件中的數據
while ((ch = fr.read()) != -1) {
fw.write(ch);//把每次讀到的內容寫入到新文件中
}
fw.close();//關閉
fr.close();//關閉
}
複製代碼
高效的複製方式
複製代碼
1 private static void function_demo6() throws IOException {
2 FileReader fr = new FileReader("demo.txt");// 建立讀取流對象
3 FileWriter fw = new FileWriter("demo3.txt");// 建立寫入流對象,若文件不存在則建立,若存在則覆蓋
4 char[] buf = new char[4096];//緩存數組
5 int ch;// 存儲讀取到的字符
6 // 循環讀取文件中的數據
7 while ((ch = fr.read(buf)) != -1) {//把每次讀取到的內容放入緩存數組中
8 fw.write(buf, 0, ch);//從緩存數組中把內容讀出來
9 }
10 fw.close();//關閉流
11 fr.close();//關閉流
12 }
複製代碼
五,高效的讀取流BufferedReader
從字符輸入流中讀取文本,緩衝各個字符,從而實現字符、數組和行的高效讀取。注意,此類能夠直接讀取行,由此也說明此類是專門爲高效的讀取文件數據的方式
複製代碼1 private static void function_demo7() throws IOException {2 FileReader fr = new FileReader("demo.txt");//讀取流對象3 BufferedReader bReader = new BufferedReader(fr);//緩衝讀取流對象,須要傳入讀取Reader的實現類4 int ch;5 while ((ch = bReader.read()) != -1) {//此read爲加強了的read方法,用的裝飾器模式6 System.out.println((char) ch);7 }8 bReader.close();//關閉該流並釋放與之關聯的全部資源;即也把讀取流的對象fr給關閉了,不須要再手動調用fr.close()9 }複製代碼 帶緩衝數組的讀取方式複製代碼1 private static void function_demo7() throws IOException {2 FileReader fr = new FileReader("demo.txt");// 讀取流對象3 BufferedReader bReader = new BufferedReader(fr);// 緩衝讀取流對象,須要傳入讀取Reader的實現類4 int ch = 0;5 char[] buff = new char[1024];6 while ((ch = bReader.read(buff)) != -1) {// 此read爲加強了的read方法,用的裝飾器模式7 System.out.println(new String(buff, 0, ch));8 }9 bReader.close();// 關閉該流並釋放與之關聯的全部資源;即也把讀取流的對象fr給關閉了,不須要再手動調用fr.close()10 }複製代碼 讀取行復制代碼1 private static void function_demo8() throws IOException {2 FileReader fr = new FileReader("demo.txt");3 BufferedReader bReader = new BufferedReader(fr);4 String line = null;//獲取每次讀到的行內容5 while ((line = bReader.readLine()) != null) {//若是讀取到了最後,則返回null6 System.out.println(line);7 }8 bReader.close();9 }複製代碼六,高效的寫入流BufferedWriter 將文本寫入字符輸出流,緩衝各個字符,從而提供單個字符、數組和字符串的高效寫入。此流寫入的時候提供了一個newLine方法,可換行。複製代碼1 private static void function_demo9() throws IOException {2 FileWriter fw = new FileWriter("demo4.txt");3 BufferedWriter bw = new BufferedWriter(fw);4 bw.write("LioneTree");5 bw.newLine();6 bw.write("go kb go kb nnw huo kb ");7 bw.close();8 }複製代碼七,使用BufferedReader與BufferedWriter實現文件複製的功能複製代碼1 private static void function_demo10() throws IOException {2 FileReader fReader = new FileReader("demo.txt");//讀取流對象3 BufferedReader bReader = new BufferedReader(fReader);//緩衝讀取流對象,傳入fReader讀取流對象4 FileWriter fWriter = new FileWriter("demo5.txt");//寫入流對象5 BufferedWriter bWriter = new BufferedWriter(fWriter);//緩衝寫入流對象,傳入bWriter寫入流對象6 String line=null;//存儲每次讀取到的行內容7 while((line=bReader.readLine())!=null) {//若是文件內容讀完了則返回null8 bWriter.write(line);//寫入讀取到的每行內容9 bWriter.newLine();//每讀完一行則換行10 }11 bReader.close();//關閉讀取流對象12 bWriter.close();//關閉寫入流對象13 }複製代碼八,跟蹤行號的緩衝字符輸入流LineNumberReader 此類定義了方法 setLineNumber(int) 和 getLineNumber(),它們可分別用於設置和獲取當前行號;字繼承自BufferedReader類複製代碼1 private static void function_demo11() throws IOException {2 FileReader fr = new FileReader("demo.txt");// 讀取流對象3 LineNumberReader lnr = new LineNumberReader(fr);// 行號讀取流對象,須要傳入讀取流fr對象4 String line = null;// 存儲讀取到的內容5 lnr.setLineNumber(100);// 設置起始行號,若不設置默認從0開始,在讀取到的每一行的末尾處自增16 while ((line = lnr.readLine()) != null) {// 按行讀取7 System.out.println(lnr.getLineNumber() + " " + line);8 }9 lnr.close();10 }複製代碼