IO流經常使用基類:java
字節流的抽象基類:InputStream,OutputStream。windows
字符流的抽象基類:Rander,Writer。數組
注:由這四個類派生出來的子類名稱都是以其父類名做爲子類名的後綴。如:InputStream的子類FileInputStream,Rreader的子類FileReader。spa
既然IO流是用於操做數據的,那麼數據最多見的體現形式是:文件。那麼先以操做文件爲主來演示。code
需求:在硬盤上,建立一個文件並寫入一些文字數據。找到一個專門用於操做文件的Writer子類對象。FileWriter。 後綴名是父類名,前綴名是該流對象的功能。對象
//建立一個FileWriter對象,該對象一被初始化就必需要明確被操做的文件。blog
//並且該文件會被建立到指定的目錄下的。「new」在堆內存中產生一個對象,同時在指定的目錄下產生一個指定名稱的文件。內存
//若是該目錄下已有同名文件,將被覆蓋。其實該步就是在明確數據要存放的目的地。資源
FileWriter fw = new FileWriter("demo.txt");//未報告的異常 java.io.IOException:必須對其進行捕捉,或聲明以便拋出。字符串
//凡是能和設備上數據發生關係去處理的收回發生IO異常。不管讀,仍是寫,或者建立。
//調用write方法,將字符串寫入到流中。
fw.write("abcde");
//刷新流對象中的緩衝中的數據。將數據刷到目的地中。
//fw.flush();
fw.close();//關閉流資源,可是關閉前會刷新一次內部的緩衝中的數據,將數據刷到目的地中,和flush刷新後流能夠繼續使用。close刷新後將流關閉。
//流對象調用的是系統中的資源進行數據的創建,因此close動做必需要作。
標準IO異常處理方式:
import java.io.*; class FileWriterDemo2; { public static void main(String[] args) { FileWriter fw = null;//外建引用,try內初始。 try { fw = new FileWriter("demo.txt"); fw.write("abcdefg"); } catch(IOException e) { System.out.println(e.toString()); } finally { try { if(fw!null)//提升代碼健壯性。注意多流狀況下要分別去關。 { fw.close(); } } catch(IOException e) { System.out.println(e.toString()); } } } }
FileWriter fw = new FileWriter("demo.txt",true);//傳遞一個true參數,表明不覆蓋已有的文件,並在已有文件的末尾處進行數據的續寫。
在windows當中,回車符是由兩個字符來表示的,\r和\n。在Linux中,\n表明換行。(單獨的\n在windows中不能識別,因此顯示出一個小黑格。)
第一種方式:經過read方法獲取。
import java.io.*; class FileReaderDemo { public static void main(String[] args)throws IOException { //建立一個文件讀取流對象,和指定名稱的文件相關聯。 //要保證該文件是已經存在的,若是不存在,會發生異常FileNotFoundException。 FileReader fr = new FileReader("demo.txt"); //調用讀取流對象的read方法。 //read()一次讀一個字符,並且會自動往下讀。\ int ch = 0; while((ch=fr.read())!=-1) { System.out.print((char)ch); } /* while(true) { int ch = fr.raed(); if(ch==-1) break; System.out.print("ch"=+(char)ch); } */ fr.close(); } }
第二種方式:經過字符數組進行獲取。
import java.io.*; class FileReaderDemo { public static void main(String[] args)throws IOException { FileReader fr = new FileReader("demo.txt"); //定義一個字符數組,用於儲存讀到的字符。 //該read(char[])返回的是讀到字符的個數。 char[] buf = new char[](1024);//一般定義爲1024的整數倍。 int num = 0; while((num=fr.read(buf))!=-1) { System.out.println(new String(buf,0,num)); } fr.close();
練習:讀取一個.java文件,並打印在控制檯上。
import java.io.*; class FileReaderTest { public static void main(String[] args)throws IOException { FileReader fr = new FileReader("DateDemo.java"); char[] buf = new char[](1024); int num = 0; while((num=fr.read(buf))!=-1) {
//此處不加ln,是由於當文本文件大於1024時,在不應換行的時候卻換行了。 System.out.print(new String(buf,0,num)); } fr.close();
講C盤一個文本文件複製到D盤
複製的原理:其實就是將C盤下的文件數據存儲到D盤下的一個文件中。
步驟:
1,在D盤建立一個文件。用於存儲C盤中的數據。
2,定義一個讀取流和C盤文件關聯。
3,經過不斷的讀寫完成數據存儲。
4,關閉資源。
import java.io.*; class CopyTest { public static viod main(String[] args)throws IOException { copy_1(); } //從C盤讀一個字符,就往D盤寫一個字符。 public static void copy_1()throws IOException { //建立目的地。 FileWriter fw = new FileWrtier("RuntimeDemo_copy.txt); //與已有文件關聯。 FileReader fr = new FileReader("RuntimeDemo.java"); int ch = 0; while((ch=fr.read())!=-1) { fw.write(ch); } fw.close(); fr.close(); } }
讀取多個字符:
public static viod copy_2(); { FileWriter fw = null; FileReader fr = null; try { fw = new FileWriter("SystemDemo_copy.txt"); fr = new FileReader("StstemDemo.java"); char [] buf = new char[1024]; int len = 0; while((len = fr.read(buf))!-1) { fw.write(buf,0,len); } catch(IOException e) { throw new RuntimeException("讀寫失敗"); } finally { if(fr!=null) try { fr.close(); } catch(IOExceprtion e) { } if(fw!=null) try { fw.close(); } catch(IOExceprtion e) { } } } }
。。。。。