--------------------ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! --------------------
1.BufferedWriter
BufferedWriter是利用的緩衝技術,操作的是輸入流,把Writer對象構造函數的參數傳入,首先是把信息讀取到緩衝流中,然後再刷新緩衝流,把讀到的文件信息傳到目的地。這提高了寫入的效率。
這裏寫入的方法增加了newLine()方法,換行,這個是跨平臺的操作,不用在寫”\r\n”,當關閉緩衝流,同時也關閉了緩衝流中封裝的輸入字符流。
緩衝區都有自己默認的長度,也可以自己設定長度,一般情況下,默認長度據夠用了
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedDemo {
public static void main(String[] args) {
FileWriter fw=null;//字符流 輸入流
BufferedWriter bw=null;//緩衝流
try {
fw=new FileWriter("F:\\demo.txt");
bw=new BufferedWriter(fw);//將字符流封裝到緩衝流中
for(int i=0;i<3;i++){
bw.write("java0"+i);
bw.newLine();//換行
bw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(bw!=null){
try {
/*關閉緩衝流,同時也關閉了裏面封裝的字符流,不需要在關閉字符流,fw*/
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2.BufferedReader
1. 概述
讀取緩衝流,將字符流的讀取流傳到BufferedReader對象的構造方法中,這樣可以提高效率,在讀取方面,除了一個一個字節讀取和數組讀取,增加了讀行方法, readLine(),
緩衝區都有自己默認的長度,也可以自己設定長度,一般情況下,默認長度據夠用了
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class BufferedDemo1 {
public static void main(String[] args) {
FileReader fr=null;//字符流輸出流
BufferedReader br=null;//緩衝流
try {
fr=new FileReader("F:\\demo.txt");
br=new BufferedReader(fr);
/*String readLine()當讀取到末尾的時候,返回null
* 否則返回的是一行的數據*/
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e1){
e1.printStackTrace();
}finally{
if(br!=null){
try {
/*關閉緩衝流,同時也關閉了裏面的字符流,不需要在關閉字符流*/
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
結果:
java00
java01
java02
2.readLine原理
其實這是裝飾類,用了裝飾設計模式,詳細參考 黑馬程序員_<<裝飾設計模式>>
模擬換行
import java.io.FileReader;
import java.io.IOException;
public class MyBufferedReader {
private FileReader fr = null;
public MyBufferedReader(FileReader fr) {
super();
this.fr = fr;
}
/* 模擬readLine的話,其實裏面封裝了一個數組,我們爲了方便,就封裝StringBuilder對象,這樣操作方便 */
public String readLine() throws IOException {
StringBuilder sb = new StringBuilder();
int ch = -1;
while ((ch = fr.read()) != -1) {
//System.out.print(ch+","); 從輸入的個數判斷出
if (ch == '\r')//當文件中就存在\r,那此時是否存入StringBuilder中呢,開始我認爲是不會存入的,但是結果輸出了,難道是讀取的時候例如:\r,把\ 和 r分開讀取了,這樣理解的話,就通順了
continue;
if (ch == '\n')//這裏和\r的疑問和理解一樣
return sb.toString();
else
sb.append((char) ch);
}
if (sb.length() != 0)// 這裏解決了,最後一樣沒有回車,防止最後一行不被輸出
return sb.toString();
return null;
}
public void close() throws IOException {
if (fr != null) {
fr.close();
}
}
}
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.Date;
importjava.util.Random;
public classClassDemo {
public static void main(String[] args) {
MyBufferedReader br = null;// 緩衝流
try {
br = new MyBufferedReader(newFileReader("F:\\demo.txt"));
String line = null;
while ((line = br.readLine())!= null) {
System.out.println(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
結果正確輸出。
3. 緩衝技術(複製文件)
package www.fuxi.IO;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedClass {
public static void main(String[] args) {
BufferedReader br = null;// 緩衝流讀取
BufferedWriter bw = null;// 緩衝流寫入
try {
/* 在這裏使用匿名類,因爲關閉的不需要字符流對象,直接把對象封裝到了緩衝流中了 */
br = new BufferedReader(new FileReader("F:\\demo.txt"));
bw = new BufferedWriter(new FileWriter("F:\\A\\demo.txt"));
String line=null;
while((line=br.readLine())!=null){//讀取
bw.write(line);//寫入
bw.newLine();//換行
bw.flush();//刷新
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bw != null) {
bw.close();
}
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4. LineNumberReader
1. 概述
這也是一個裝飾類。繼承了BufferedReader類(這也是一個裝飾了類),重寫了ReadLine方法,增加了行號的設置和獲得。
public class LineNumberDemo{
public static void main(String[] args) {
LineNumberReader lnr = null;
try {
lnr = new LineNumberReader(new FileReader("F:\\ClassDemo.java"));
String line = null;
lnr.setLineNumber(10);//在這裏也可以自己設置行號的開始
while ((line = lnr.readLine()) != null) {
System.out.println(lnr.getLineNumber()+":"+line);
}
} catch (FileNotFoundException e) {
System.out.println("沒有找到指定的文件");
} catch (IOException e) {
System.out.println("讀取失敗");
} finally {
if (lnr != null) {
try {
lnr.close();
} catch (IOException e) {
System.out.println("流關閉失敗");
}
}
}
}
}
部分結果:
11:package www.fuxi.IO;
12:
13:importjava.io.FileNotFoundException;
14:import java.io.FileReader;
15:import java.io.IOException;
16:
17:public class ClassDemo {
18: public static void main(String[] args) {
19:
20: MyBufferedReaderbr = null;// 緩衝流
2. 模擬此類
自己不需要寫readLine的原理,直接調用父類的方法即可,然後增加行號的設置和獲得。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.Reader;
/*自定義的可以設置行號讀取類*/
public class MyLineNumberReader extends BufferedReader {
private Reader r;// 讀取流字符流
private int LineNumber;// 行號
public MyLineNumberReader(Reader r) {
super(r);// 父類的構造方法
}
public int getLineNumber() {
return LineNumber;
}
public void setLineNumber(int lineNumber) {
LineNumber = lineNumber;
}
public String readLine() throws IOException {
this.LineNumber++;// 每讀取一行,行號就增加
return super.readLine();
}
public void close() throws IOException {
super.close();
}
}
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
public class LineNumberDemo {
public static void main(String[] args) {
MyLineNumberReader lnr = null;
try {
lnr = new MyLineNumberReader(new FileReader("F:\\ClassDemo.java"));
String line = null;
//lnr.setLineNumber(10);//在這裏也可以自己設置行號的開始 默認的是從1開始
while ((line = lnr.readLine()) != null) {
System.out.println(lnr.getLineNumber()+":"+line);
}
} catch (FileNotFoundException e) {
System.out.println("沒有找到指定的文件");
} catch (IOExceptione) {
System.out.println("讀取失敗");
} finally {
if (lnr != null) {
try {
lnr.close();
} catch (IOException e) {
System.out.println("流關閉失敗");
}
}
}
}
}
部分結果:
1:package www.fuxi.IO;
2:
3:importjava.io.FileNotFoundException;
4:import java.io.FileReader;
5:import java.io.IOException;
6:
7:public class ClassDemo {
8: public static void main(String[]args) {
--------------------ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! --------------------