黑马程序员_...
--------------------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培训、期待与您交流! --------------------