黑馬程序員——java基礎---IO(input output)流字符流
------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------
io(input output)流特點:
1,io流用來處理數據之間的傳輸
2,java對數據的操作是通過流的方式;
3,java用于操作流的對象都在io包中;
4,流按操作數據分為兩種:字節流和字符流;
5,流按流向分為:輸入流和輸出流。
注意:流只能操作數據,而不能操作文件。
3、IO流的常用基類:
1)字節流的抽象基流:InputStream和OutputStream
2)字符流的抽象基流:Reader和Writer
注:此四個類派生出來的子類名稱都是以父類名作為子類名的后綴,以前綴為其功能;如InputStream子類FileInputStream;Reader子類FileReader
既然IO流是用于操作數據的,那么數據的最常見體現形式是:文件。
需求:在硬盤上,創建一個文件并寫入一些文字數據。
找到一個專門用于操作文件的Writer子類對象。FileWriter。后綴名是父類名,前綴名是該流對象的功能。
如下示例:
import java.io.*;class FileWriterDemo{ public static void main(String[] args) throws IOException { //創建一個FileWriter對象。該對象一被初始化就必須要明確被操作的文件。 //而且該文件會被創建到指定目錄下。如果該目錄下已有同名文件,將被覆蓋。 //其實該步就是在明確數據要存放的目的地。 FileWriter fw = new FileWriter("demo.txt"); //調用write方法,將字符串寫入到流中。 fw.write("abcde"); //刷新流對象中的緩沖中的數據。 //將數據刷到目的地中。 //fw.flush(); //關閉流資源,但是關閉之前會刷新一次內部的緩沖中的數據。 //將數據刷到目的地中。 //和flush區別:flush刷新后,流可以繼續使用,close刷新后,會將流關閉。 fw.close(); }}注意:
其實java自身不能寫入數據,而是調用系統內部方式完成數據的書寫,使用系統資源后,一定要關閉資源。
close()和flush()區別:
flush()刷新后,流可以繼續使用;
而close()刷新后,將會關閉流,不可再寫入字符流。
2,IO異常的處理方式
由于在創建對象時,需要指定創建文件位置,如果指定的位置不存在,就會發生IOException異常,所以在整個步驟中,需要對IO異常進行try處理。
/*IO異常的處理方式。*/import java.io.*;class FileWriterDemo2{ public static void main(String[] args) { FileWriter fw = null; try { fw = new FileWriter("demo.txt"); fw.write("abcdefg"); } catch (IOException e) { System.out.注意:
1、定義文件路徑時,可以用“/”或者“//”。
2、在創建一個文件時,如果目錄下有同名文件將被覆蓋。
3、在讀取文件時,必須保證該文件已存在,否則出異常。
4、在關閉流時,要判斷流是否為空;
對已有文件的數據續寫指定數據
文件的數據的續寫是通過構造函數 FileWriter(Strings,boolean append),在創建對象時,傳遞一個true參數,代表不覆蓋已有的文件。并在已有文件的末尾處進行數據續寫。(windows系統中的文件內換行用/r/n兩個轉義字符表示,在linux系統中只用/n表示換行),如下:
/*演示對已有文件的數據續寫。*/import java.io.*;class FileWriterDemo3{ public static void main(String[] args) { FileWriter fw = null; try {//傳遞一個true參數,代表不覆蓋已有的文件。并在已有文件的末尾處進行數據續寫。 fw = new FileWriter("demo.txt",true); fw.write("nihao/r/nxiexie"); } catch (IOException e) { System.out.println("catch:"+e.toString()); } finally { try { if(fw!=null) fw.close(); } catch (IOException e) { System.out.println(e.toString()); } } }}文件流讀取
文件讀取有兩種方式:第一種方式是讀取單個字符,第二種方式是通過字符數組進行讀取。
1,一次讀取一個字符:
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.println(ch); } /* while(true) { int ch = fr.read(); if(ch==-1) break; System.out.println("ch="+(char)ch); } */ //關閉流資源 fr.close(); }}2,通過字符數組進行讀取
/*第二種方式:通過字符數組進行讀取。*/import java.io.*;class FileReaderDemo2 { public static void main(String[] args) { FileReader fr = null; Try{ fr = new FileReader("demo.txt"); //定義一個字符數組。用于存儲讀到字符。 //該read(char[])返回的是讀到字符個數。 char[] buf = new char[1024]; int num = 0; while((num=fr.read(buf))!=-1) { System.out.println(new String(buf,0,num)); } }catch(Exception e){ System.out.println(e); } finally{ if(fr != null){ try { fr.close(); } catch (IOException e) { } } } }}小練習:文本文件的拷貝,將C盤一個文本文件復制到D盤。
import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;/*復制的原理:其實就是將C盤下的文件數據存儲到D盤的一個文件中。步驟:1,在D盤創建一個文件。用于存儲C盤文件中的數據。2,定義讀取流和C盤文件關聯。3,通過不斷的讀寫完成數據存儲。4,關閉資源。*/public class CopyText { public static void main(String[] args) { // TODO Auto-generated method stub copy_2(); } //從C盤讀一個字符數組,才往D盤寫入 public static void copy_2() { FileWriter fw = null; FileReader fr = null; try { fw = new FileWriter("c://a.txt"); fr = new FileReader("d://b.txt"); 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 (IOException e) { } if(fw!=null) try { fw.close(); } catch (IOException e) { } } } //從C盤讀一個字符,就往D盤寫一個字符。 public static void copy_1() { //創建目的地。 FileWriter fw = null; FileReader fr = null; try { fw = new FileWriter("c://a.txt"); //與已有文件關聯。 fr = new FileReader("d://b.java"); int ch = 0; while((ch=fr.read())!=-1) { fw.write(ch); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(fw != null){ try { fw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(fr !=null){ try { fr.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }}
新聞熱點
疑難解答