上一篇内容java IO 一 (读写字符串)
使用BufferedReader和BufferedWriter实现一个文本文件的复制
private static void copy() {
BufferedReader bfr=null;
BufferedWriter bfw=null;
try {
bfr=new BufferedReader(new FileReader("D:/FileReadDemo.java"));
bfw=new BufferedWriter(new FileWriter("D:/FileReadDemo_Copy.java"));
String line=null;
while((line=bfr.readLine())!=null){
bfw.write(line);
bfw.newLine();
bfw.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(bfw!=null){
try {
bfw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(bfr!=null){
try {
bfr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
下面看看比较重要的代码
bfr=new BufferedReader(new FileReader("D:/FileReadDemo.java"));
JAVA中关于BufferedReader的相关描述。
从一个字符数如流中读入文本信息,提供字符缓存来提高读取字符、字符数组或者一行字符的效率。你可以指定缓冲区的大小,如果不指定,就是用默认的大小。一般我们不需要去指定,使用默认的即可。通常情况下,一个“Reader”的读取操作会是顶层的字符或者字节流产生一个相应的读取请求。因此,建议用BufferedReader把一些“Reader包裹起来”,比如“FlieReader和InputStreamReader”–因为这些Reader的读取效率不高。如下所示:
BufferedReader in= new BufferedReader(new FileReader("foo.in"));
会缓冲指定文件中的输入流。如果不进行缓冲操作,那么每次调用read()方法或者readlLine()方法会从文件中读取一个字节,转化成字符然后返回,这样效率很低。
使用DataInputStreams 来输入文本信息的程序也可以使用相应的BufferedReader来替代每个DataInputStream。
BufferedReader的构造函数
//使用默认缓冲区大小来实例化一个字符缓冲输入流
BufferedReader(Reader in)
////使用指定缓冲区大小sz(sz应该是2的幂的形式,比如512,1024,2048等等)来实例化一个字符缓冲输入流
BufferedReader(Reader in, int sz)
//读入一行字符,但不包括这一行的终止字符(回车'\r',换行'\n')这个方法比较方便。
String readLine()
所以我们在读完一行,向外写的时候这这样的:
//写出一行字符串
bfw.write(line);
//换行
bfw.newLine();
接下来简要说一下,这个BufferedRead实现缓冲的原理。我们查看BufferedRead的源码。里面定义了两个成员变量(还有其他很多的成员变量,没有列出来。)
private char cb[];//用来缓冲的字符数组
private static int defaultCharBufferSize = 8192;//用来缓冲的字符数组的默认的大小
原理:当BufferedRead读取的时候比如说调用readLine()方法,最终调用的还是read()方法,每次读取一个字符。但是每次读到一个字符的时候并没有直接返回(从外存返回到内存中),而是把这个独到的字符放进了BufferedRead的cb[]数组中,当读到一行的末尾的位置的时候,就把这个字符数组cb[]转换成一个字符串返回(一次性从外存返回一个字符串,减少了内存和外存交互的次数),这样就提高了读取的效率,仅此而已。
JAVA JDK 关于BufferedWriter的解释
向字符数处流中写文本信息,提供字符缓存,以提高写单个字符、字符数组、字符串的效率。缓冲区大小可以指定,也可以使用默认的,通常我们使用默认的就够了。默认缓冲区大小是8192个字节。newLine()方法使用系统自带的换行符进行换行。如果你在写完一行数据后想在新的一行写数据,可以调用这个方法。通常情况下,一个Writer会立即向底层的字符或者字节输出流发送要写出的数据。除非是要求立即输出,建议使用BufferedWriter来包裹任何Writer,例如FileWriter和OutputStreaemWriter—-因为这些Writer的效率不高
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
会缓冲PrintWriter到文件中的输出。如果没有缓冲的话,每次调用print()方法就会把一个字符转化为字节并立即写到文件中,效率不高。
BufferedWriter实现缓冲输出的原理和BufferedRead的原理类似。我们打开BufferedWriter的源码,发现在其内部也有两个变量和BufferedReader中的一样。
private char cb[];
private static int defaultCharBufferSize = 8192;
BufferedWriter的原理(可能不太准确):当进行写操作的时候使用Write(String string)(内存向外存写),BufferedWriter会先把读取到的字符存储在cb[]中,然后调用flush()方法,一次性将这个字符数组写到外存。(减少内存和外存的交互次数,提高了写的效率)
最近这几天老是腰疼,艰难啊。身体还是第一位的,没有身体,其他都是扯淡。注意休息,保重身体。