1.Writer:字元輸出流 Writer: FileWriter BufferedWriter:newLine()//換行 簡單步驟: FileWriter fw=new FileWriter("e:\\t.txt"); fw.write("hello");//寫入到內部的緩衝區,是一個位元組數組 ...
1.Writer:字元輸出流
Writer:
FileWriter
BufferedWriter:newLine()//換行
簡單步驟:
FileWriter fw=new FileWriter("e:\\t.txt");
fw.write("hello");//寫入到內部的緩衝區,是一個位元組數組
fw.flush();
2.字元輸出流4步:
1:創建文件輸出流對象和文件相關聯
//文件可以事先存在也可以不存在,如果不存在會自動創建
FileWriter fileWriter=new FileWriter("temp.txt");
//2:使用文件輸出流對象向文件中寫入數據,每次都從文件的開頭寫入
fileWriter.write("abc");//因為需要有一個查表的過程,所以數據先寫入到流對象內部的緩衝區了
//3.把緩衝區中的數據刷到文件中
//fileWriter.flush();
fileWriter.write("ef");
//關閉流
fileWriter.close(); //關閉流時會先刷新
//fileWriter.write("ef");關閉流不能再寫入數據
標註:寫入換行的方式:
方法1; newLine()
方法2: Properties pro=System.getProperties();
String line= pro.getProperty("line.separator");//得到系統換行符
FileWriter fw = new FileWriter("temp.txt");
fw.write("hello");//每次都從文件的開頭寫入
//向文件中寫入換行
fw.write(line);
3.Reader:字元輸入流
FileReader
BufferedReader: readLine()----返回的一行不包括換行符,所以要自己換行newLine()
4.字元流輸入3步:
//讀取一個文本文件
//因為是文本所以使用字元流,又因為是讀取,所以使用Reader,又因為讀取的是文件,所以
//使用Reader的可以讀取文件的子類:FileReader
//先確定使用字元流還是位元組流,再確定是輸出流還是輸入流,最後確定設備
1.創建字元讀取流對象和被讀取的文件相關聯
//被讀取的文件需要存在
FileReader fr = new FileReader("temp.txt"); // FileNotFoundException
2.讀取
//int read() 一次讀一個字元 :每次都從磁碟上取,效率低
//因為read()讀到最後,如果讀不到內容了,返回-1
int num=0;
while((num=fr.read())!=-1){
System.out.print((char)num);
}
3.//關閉流
fr.close();
5.FileReader類中read()方法的優化:
定義一個char型數組,接收讀出的單個字元,然後當數組滿了,就返回給記憶體
FileReader fr = new FileReader("temp.txt");//FileNotFoundException
char[] arr=new char[1024];
int num=0;
while((num=fr.read(arr))!=-1)//從磁碟上讀取時仍然是一個一個的讀,當數組存滿時再返回
{
String str=new String(arr,0,num);
System.out.print(str);
}
6.因為在讀寫過程中都會拋出異常:IOException 或 NullPointerException 或 FileNotFoundException
所以要接收處理異常
1 例1: 2 FileReader fr=new FileReader("tt.txt"); 3 4 int ch = fr.read(); 5 6 讀到末尾:-1 7 8 char[] arr=new char[1024]; 9 int num=0; 10 while((num=fr.read(arr))!=-1) 11 { 12 System.out.print(new String(arr,0,num)); 13 } 14 15 try{ 16 }catch(IOException e){ 17 18 }finally{ 19 20 if(fr!=null) 21 fr.close(); 22 }
1 例2: 2 import java.io.*; 3 class Demo1 4 { 5 public static void main(String[] args) 6 { 7 FileWriter fileWriter=null; 8 9 try{ 10 11 //java.io.FileNotFoundException: h:\temp.txt (系統找不到指定的路徑。) 12 fileWriter = new FileWriter("temp.txt");//文件創建失敗,那麼FileWriter對象也會創建失敗 13 14 fileWriter.write("abc"); 15 16 }catch(IOException e){ 17 18 e.printStackTrace(); 19 20 }finally{ 21 try{ 22 //null.close() java.lang.NullPointerException 23 if(fileWriter!=null) 24 fileWriter.close();//必須執行,不一定能執行 25 26 }catch(IOException e){ 27 28 e.printStackTrace(); 29 } 30 } 31 } 32 }
7.緩衝流:
字元流的緩衝區:緩衝區只是為了提高讀寫的效率
緩衝區不具備讀寫的功能
使用緩衝區必須結合著讀取流或寫入流
緩衝讀取流:BufferedReader: 有一個實現了一次讀一行的功能 String readLine()(註意:讀到末尾時返回null)
緩衝寫入流:BufferedWriter: 有一個實現了跨平臺的newLine()方法
8.使用緩衝流向文本文件中寫入數據
1.因為緩衝流不具備寫入的功能,所以需要先創建文件輸出流對象
FileWriter fw = new FileWriter("tt.txt");//用於向文件中寫入數據
2:為了提高寫入的效率,使用輸出緩衝流
把需要提高效率的輸出流對象傳遞給緩衝流對象的構造方法
BufferedWriter bw = new BufferedWriter(fw);
3.使用緩衝輸出流對象操作文件
for(int i=1;i<=5;i++)
{
bw.write("java"+i);
bw.newLine();//寫入換行
bw.flush();
}
//關閉流
//關閉緩衝流就是關閉文件輸出流對象
bw.close();
使用緩衝流從文本文件中讀取數據
//因為緩衝流不具備讀的功能,所以需要先創建文件讀取流對象
FileReader fr = new FileReader("tt.txt");
//為了提高讀取的效率,創建緩衝讀取流對象
BufferedReader br = new BufferedReader(fr);
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
}
br.close();
9.裝飾設計模式:基於已經存在的功能提供更強大的功能 (瞭解:java設計模式一共有23種)
裝飾設計模式的由來:
MediaReader
FileReader
提高讀取的效率:
Reader
MediaReader
----BufferedMediaReader
FileReader
----BufferedFileReader
OtherReader
----BufferedOtherReader
當有很多Reader子類的時候,這個體系會越來越龐大
所以既然都是提高效率的,那麼就把這個功能提取出來,誰需要被提高效率就把誰傳過去
Reader
MediaReader
FileReader
OtherReader
BufferedReader ---裝飾類也屬於這個體系
class BufferedReader
{
private Reader r;
public BufferedReader(Reader r)
{
this.r=r;
}
}