流 數據流 用於傳輸數據。IO流 Input/Output流。數據從外部流向程式 輸入流;數據從程式流向外部的時候--輸出流。讀取一個文件 數據從文件流向程式 輸入流;向一個文件中寫入數據 數據從程式流向文件 輸出流 根據數據流動的方向:輸入流/輸出流 根據數據傳輸的形式:位元組流/字元流 輸入流 輸 ...
流
數據流---用於傳輸數據。IO流---Input/Output流。數據從外部流向程式---輸入流;數據從程式流向外部的時候--輸出流。讀取一個文件---數據從文件流向程式---輸入流;向一個文件中寫入數據---數據從程式流向文件---輸出流
根據數據流動的方向:輸入流/輸出流
根據數據傳輸的形式:位元組流/字元流
|
輸入流 |
輸出流 |
位元組流 |
InputStream |
OutputSteam |
字元流 |
Reader |
Writer |
這四個類是Java中四個流的基本類,但是這四個類都是抽象類,都不能用於直接創建對象
數據的來源:硬碟、網路、記憶體、輸入設備
向一個文件中去寫入數據---txt文件---字元流、輸出流、文件流---
最簡單的一個輸入流,寫入緩衝區中,再從緩衝區中讀取出來
1 public static void main(String[] args) throws IOException { 2 // TODO Auto-generated method stub 3 String c; //設置一個字元串去接收緩衝區 4 InputStreamReader IsReader=new InputStreamReader(System.in);//輸入流:鍵盤輸入 5 BufferedReader bReader=new BufferedReader(IsReader);//將輸入的存入緩衝區中 6 System.out.println("輸入字元按q退出"); 7 do { 8 c= bReader.readLine();//從緩衝區中讀取 9 System.out.println(c); 10 } while (!c.equals("q")); 11 }
字元流
FileWriter
構造函數
FileWriter(String name)--傳入文件路徑,操作對應的文件---當文件不存在的時候,會創建這個文件;如果文件存在,則創建一個新文件覆蓋源文件。
重要方法
write(String s)---寫出字元串。數據不是直接寫到目的地而是寫到緩衝區中,等到緩衝區滿了之後才會寫到目的地中
flush()---沖刷緩衝區
close()---關閉流。流在關閉之前會自動的沖刷緩衝區。
代碼實現:
1 public static void main(String[] args) throws IOException { 2 //創建一個FileWriter對象,並指定文件路徑,該文件會被創建到指定目錄下。如果該目錄有同名文件,那麼該文件將被覆蓋。 3 FileWriter fw = new FileWriter("1.txt"); 4 //調用write的方法將字元串寫到流中 5 fw.write("hello world!"); 6 //刷新流對象緩衝中的數據,將數據刷到目的地中 7 fw.flush(); 8 //關閉流資源,但是關閉之前會刷新一次內部緩衝中的數據。當我們結束輸入時候,必須close(); 9 fw.write("刷新"); 10 fw.close(); 11 //flush和close的區別:flush刷新後可以繼續輸入,close刷新後不能繼續輸入。 12 }
流的異常處理
1. 流對象要外置定義內置初始化
2. 判斷流對象是否初始化成功---判斷流對象是否為空
3. 關流操作無論成功與否,都需要將流對象值為null
FileReader
1 | public int read() throws IOException 讀取單個字元,返回一個int型變數代表讀取到的字元 |
2 | public int read(char [] c, int offset, int len) 讀取字元到c數組,返回讀取到字元的個數 |
代碼實現:
1 public static void main(String[] args) throws IOException { 2 //創建FileReader對象,並讀取1.txt文件 3 FileReader fr = new FileReader("1.txt"); 4 //單字元讀取 。。。。。。多字元的讀取,創建數組將1.txt文件存入數組中,在讀取出來char [] buf = new char[6]; 5 int ch = 0; 6 //一直讀取文件中的內容直到文件的尾部 7 while((ch = fr.read())!=-1) { 8 /* 輸出字元串 9 * 10 * String(char[] value , int offest,int count) 分配一個新的String,包含從offest開始的count個字元 new String(buf,0,ch} 11 * */ 12 System.out.print((char)ch); 13 } 14 fr.close(); //關閉流 15 }
兩個結合可以實現一個文件的拷貝
將1.txt文件內容拷貝到2.txt中
代碼實現:
1 public static void main(String[] args) throws IOException { 2 FileReader fr=new FileReader("1.txt");//先讀取需要拷貝的文件 3 FileWriter fw=new FileWriter("2.txt");//拷貝文件內容複製到的另個文件路徑 4 int ch=0; 5 while ((ch=fr.read())!=-1) { //讀個讀取內容 6 fw.write((char)ch); //將讀取的內容寫入文件中 7 } 8 fr.close(); //關閉讀取流 9 fw.close();//關閉寫入流 10 }
位元組流
其實位元組流和字元流是差不多的形式,看懂了上面,下麵就不用多說了
文件輸入流: FileInputStream類
簡要的說是打開文件,將文件數據讀取到記憶體中
代碼實現:
1 public static void main(String[] args) throws IOException { 2 FileInputStream fStream=new FileInputStream("1.txt");//創建文件輸入流對象 3 int ch=0; 4 while ((ch=fStream.read())!=-1) { //依次讀取文件內容賦值給ch 5 System.out.print((char)ch); //輸出內容-----(char)ch轉換成字元輸出 6 } 7 }
文件輸出流: FileOutputStream類
目的是將記憶體中的數據讀取到文件中
代碼實現:
1 public static void main(String[] args) throws IOException { 2 int count, n = 20; 3 //創建位元組數組 4 byte buffer[] = new byte[n]; 5 //將輸入的位元組存入位元組數組中 6 count = System.in.read(buffer);//System.in.read()返回的是輸入數值的 ASKII 碼(一個 int 整數) 7 FileOutputStream fO=new FileOutputStream("1.txt"); //創建文件輸出流對象,指定文件路徑 8 fO.write(buffer, 0, count); //將位元組寫入文件,顯示字元 9 fO.close();//關閉流 10 }
FileInputStream流和FileOutputStream的應用
將1.txt文件拷貝到2.txt 文件中
代碼實現:
1 public static void main(String[] args) throws IOException { 2 FileInputStream fIn=new FileInputStream("1.txt");//創建文件輸入流對象 拷貝對象文件,指定文件路徑 3 FileOutputStream fOut=new FileOutputStream("2.txt");//創建文件輸出流對象,,指定寫入內容的文件路徑 4 int ch=0; 5 while ((ch=fIn.read())!=-1) {//迴圈讀取 6 fOut.write(ch);//將內容寫入 7 } 8 fIn.close();//關閉流 9 fOut.close();//關閉流 10 }
OutputStreamWriter---將一個位元組輸出流轉化為字元輸出流
InputStreamReader---將一個位元組輸入流轉化為字元輸入流
緩衝區
電腦訪問外部設備非常耗時。訪問外存的頻率越高,造成CPU閑置的概率就越大。為了減少訪問外存的次數,應該在一次對外設的訪問中,讀寫更多的數據。為此,除了程式和流節點間交換數據必需的讀寫機制外,還應該增加緩衝機制。緩衝流就是每一個數據流分配一個緩衝區,一個緩衝區就是一個臨時存儲數據的記憶體。這樣可以減少訪問硬碟的次數,提高傳輸效率。
1. 字元流的緩衝區:BufferedReader和BufferedWreiter
* 緩衝區的出現時為了提高流的操作效率而出現的.
* 需要被提高效率的流作為參數傳遞給緩衝區的構造函數
* 在緩衝區中封裝了一個數組,存入數據後一次取出
BufferedReader
自帶了緩衝區,需要一個Reader對象來構建這個BufferedReader對象---BufferedReader最主要的作用提供緩衝區,從字元輸入流中來獲取數據;Reader對象來指名數據的具體來源
簡單代碼實現:
1 public static void main(String[] args) throws IOException {
2 FileReader fReader=new FileReader("1.txt");//創建一個文件讀取對象,並讀取文件
3 BufferedReader bReader=new BufferedReader(fReader);//將文件內容放入緩衝區中------ 需要被提高效率的流作為參數傳遞給緩衝區的構造函數
4 StringBuffer sBuffer=new StringBuffer(); //創建一個StringBuffer類的字元串後面接收讀出的數據
5 while (bReader.ready()) { //迴圈讀取知道文件尾部
6 sBuffer.append((char)bReader.read());//將文件內容逐一添加到sBuffer中
7 }
8 System.out.println(sBuffer.toString());//輸出
9 fReader.close();//關閉讀取流
10 bReader.close();//關閉緩衝區讀取流
11 }
BufferedWriter
代碼實現:
1 public static void main(String[] args) throws IOException {
2 FileWriter fWriter=new FileWriter("1.txt");//創建寫入流對象,並指定創建的文件路徑;
3 BufferedWriter bWriter=new BufferedWriter(fWriter);//創建寫入流的緩衝區
4 bWriter.write("abcdf");//向緩衝區寫入字元
5 bWriter.flush(); //刷新緩衝區
6 bWriter.newLine();//newLine()在不同的操作系統下自動轉義為當前系統認識對的回車換行
7 bWriter.write("qwer");
8 bWriter.flush(); //刷新緩衝區
9 bWriter.close();//關閉緩衝區
10 fWriter.close();//關閉寫入流
11 }
未寫完待續
系統流/標準流---位元組流
底層使用位元組流來實現的
System.out 標準輸出流
System.in 標準輸入流
System.err 標準錯誤流