您的位置:首页 > 职场人生

黑马程序员——IO流(2)

2014-10-16 14:14 162 查看
上篇博客中我们学习了JAVA IO中的字符流,其实字符流中Writer和Reader还有对应的缓冲区,分别是BufferedWriter和BufferedReader。缓冲区的出现提高了对数据的读写效率,缓冲区要结合流才可以使用,在创建缓冲区之前,必须要有流对象,在流的基础上对流的功能进行了增强。其实这也是Java中装饰设计模式的提现。

BufferedWriter步骤:

(1)创建一个字符写入流对象。

(2)将需要被提高效率的流对象作为参数传递给缓冲区的构造函数。

(3)将缓冲区刷新。

(4)关闭缓冲区,就是在关闭缓冲区中的流对象。

import java.io.*;

public class IO_test4 {
public static void main(String[] args) {
FileWriter fw=null;
BufferedWriter buffw=null;
try {
//创建一个字符写入流对象
fw=new FileWriter("c:\\test2.txt");
//创建一个字符写入流对象
buffw=new BufferedWriter(fw);
buffw.write("abcdeg");
//BufferedWriter提供的跨平台的换行符
buffw.newLine();
//将缓冲区刷新
buffw.flush();
//将指定字符序列添加到序列后面
buffw.append("hello!");
buffw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(buffw!=null)
//关闭缓冲区,就是在关闭缓冲区中的流对象
buffw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}


BufferedReader步骤:

(1)创建一个字符读取流对象。

(2)将需要被提高效率的流对象作为参数传递给缓冲区的构造函数。

(3)读取流对象:该缓冲区中提供了一个一次读一行的方法。当返回null时表示文件读到末尾。

(4)关闭流。

import java.io.*;

public class IO_test5 {
public static void main(String[] args) {
FileReader fr=null;
BufferedReader buffr=null;
try {
//创建一个字符读取流对象
fr=new FileReader("c:\\test2.txt");
//将需要被提高效率的流对象作为参数传递给缓冲区的构造函数。
buffr=new BufferedReader(fr);
String line=null;
//读取流对象:readLine()一次读一行,当返回null时表示文件读到末尾。
while((line=buffr.readLine())!=null){
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
//关闭流
if(buffr!=null)
buffr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}


加入BufferedWriter和BufferedReader后的文件复制:

import java.io.*;

public class IO_test6 {
public static void main(String[] args) {
BufferedWriter buffw=null;
BufferedReader buffr=null;
try {
buffw=new BufferedWriter(new FileWriter("d:\\test_2.txt"));
buffr=new BufferedReader(new FileReader("c:\\test2.txt"));
String line=null;
while((line=buffr.readLine())!=null){
buffw.write(line);
buffw.newLine();
buffw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(buffw!=null)
buffw.close();
} catch (IOException e) {
e.printStackTrace();
}

try {
if(buffr!=null)
buffr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}


总结:

BufferedWrite:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。

该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator定义。并非所有平台都使用新行符 ('\n') 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。

通常 Writer 将其输出立即发送到底层字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer()。

BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。

通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader )。例如,

BufferedReader in= new BufferedReader(new FileReader("foo.in"));

将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: