IO學習筆記(一)
一、對文件的寫操作
1. FileWriter對象
FileWriter fw = new FileWriter("XXX");
隻要對文件進行IO操作,就會有IOException異常。
創建一個FileWriter對象,該對象一初始化,必須要明確要操作的文件。
而且如果在該目錄下如果存在與指定文件同名的文件,那麼同名文件將被覆蓋。
在用FileWriter對象寫文件的時候,數據是被寫到了緩衝中,所以要flush()。
當我們調用flush()方法時,FileWriter對象沒有被關閉,我們可以繼續向其中寫數據。
調用FileWriter對象的close()方法前,會默認的自動調用flush()方法,但是調用close()方法後,將不能再進行寫操作。
2. 對IO操作的異常的處理方式
在try外創建引用,在try內進行初始化,對FileWriter對象的關閉要在finally中執行,並且要加入不等於空的判斷,防止文件找不到異常。
3. 利用FileWriter進行文件的續寫
查閱JDK後我們發現在FileWriter的構造函數FileWriter(String fileName, boolean append)
對文件的續寫給予了支持。
在文件續寫時要注意的一個問題是:在Windows下的換行 \r\n 在linux下為\n
二、對文件的讀操作
4. FileReader對象
FileReader fr = new FileReader("XXX");
fr.read();一個字符一個字符的讀取即讀取單個字符,每次返回的是一個字符,但是整形的,需要我們強製的轉換成char。
fr.read(c);------read(char[] cbuf) 將讀到的字符放入數組
fr.read(c,0,len);------read(char[] cbuf, int off, int len)
將字符讀入數組的某一部分
讀到文件的末尾會返回-1
5. 文件的拷貝(簡寫)
FileWriter fw = new FileWriter("xxx");
FileReader fr = new FileReader("xxxx");
char[] buf = new char[1024];
int len = 0 ;
while ((len = fr.read(buf))) {
fw.write(buf,0,len);
}
fw.close();
fr.close();
6. BufferWriter---BufferedReader
緩衝區的出現是為了提高流的操作效率,在緩衝區創建之前必須有流對象
BufferedWriter(Writer out)
BufferedWriter(Writer out, int sz)
BufferedWriter中多了一個newLine()的方法。
BufferedReader中出現了一個新的方法,readLine(),一次讀一行的方法包含改行內容的字符串,不包含任何行終止符,如果已到達流的末尾,則返回null.
BufferedReader(Reader in)
BufferedReader(Reader in, int sz)
文件拷貝實現-----(一)
BufferedWriter bufw = new BufferedWriter(new FileWriter("D:\\a.txt"));
BufferedReader bufr = new BufferedReader(new FileReader("d:\\copy.txt"));
String str = null;
while ((str = bufr.readLine()) != null) {
bufw.write(str);
bufw.newLine();
bufw.flush();
}
文件拷貝實現-----(二)
FileWriter fw = new FileWriter("A.txt");
BufferedWriter bufw = new BufferedWriter(fw);
bufw.write("aaaaaaaccc");
bufw.flush();
7. readLine()方法的實現原理
8. 裝飾設計模式的應用
當已有類的方法不能滿足我們的需求的時候,我們可以采用裝飾設計模式來對我們已有的對象進行增強,這裏要注意是對對象的增強,如何對對象進行增強呢?我們可以定義一個新的類,然後在這個類中通過構造方法中傳入原來的對象,基於已有的功能,並提供加強功能,那麼自定義的類稱為裝飾類。在IO操作中,BufferedWriter 就是采用了裝飾設計模式。
9.
FileInputStream
FileOutputStream
采用字節的方式對文件進行操作,在對圖片、聲音、視頻等文件操作的時候就必須采用字節的方式對文件進行讀取。其操作與字符流的操作基本一致,隻是中間存放數據的數組發生了變化,由原來的字符數組變成了字節數組。
FileInputStream fi = new FileInputStream("D:\\1.jpg");
FileOutputStream fo = new FileOutputStream("D:\\2.jpg");
byte[] b = new byte[1024];
int len = 0;
while ((len=fi.read(b))!=-1)
{
fo.write(b,0,len);
}
10.
BufferedInputStream(InputStream in)
BufferedOutputStream(OutputStream out)
實現緩衝的輸入輸出流,與字符緩衝的輸入輸出流類似,都是在底層實現了數組,所以我們在使用的時候也不需要字節手動去創建字節數組,直接用就可以。
FileInputStream fi = new FileInputStream("D:\\1.jpg");
FileOutputStream fo = new FileOutputStream("D:\\2.jpg");
BufferedOutputStream bufo = new BufferedOutputStream(fo);
BufferedInputStream bufi = new BufferedInputStream(fi);
int len = 0;
while ((len=bufi.read())!=-1)
{
bufo.write(len);
}
最後更新:2017-04-02 06:51:53