接上一篇,在实际的应用中,一般很少用到节点流,而是用缓冲流(一种处理流)来处理相应的数据。主要原因是缓冲流实现了对节点流的加速处理。使用缓冲流可以更快速的实现对数据的操作,何乐而不为呢。
这里我们提一下整个IO类的的主要对应关系。如下表:
抽象基类 | 节点流 | 缓冲流(处理流的一种) |
---|---|---|
InputStream | FileInputStream | BufferedInputStream |
OutputStream | FileOutputStream | BufferedOutputStream |
Reader | FileReader | BufferedReader |
Writer | FileWriter | BufferedWriter |
其实基本上与节点流差不多,只是多了一道工序:把节点流作为参数来创建缓冲流。所以用缓冲流来实现文件操作的步骤大致如下几步:
- 创建File对象
- 创建节点流
- 创建缓冲流
- 进行操作
- 关闭缓冲流(缓冲流会自动关闭对应的节点流)
public void BufferCopy(String src,String dest)
{
File f1=null;
File f2=null;
FileInputStream fis=null;
FileOutputStream fos=null;
BufferedInputStream bis=null;
BufferedOutputStream bos=null;
try {
//第一步:创建File文件
f1=new File(src);
f2=new File(dest);
//第二部,创建流
fis=new FileInputStream(f1);
fos=new FileOutputStream(f2);
//第三部,创建缓冲流
bis=new BufferedInputStream(fis);
bos=new BufferedOutputStream(fos);
//对缓冲流操作
byte[] b=new byte[50];
int len;
while((len=bis.read(b))!=-1)
{
bos.write(b, 0, len);
bos.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
finally
{
//close
if(bos!=null)
{
try {
bos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(bis!=null)
{
try {
bis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
这里是使用BufferedInputStream和BufferedOutputStream来实现对各种文件进行操作,对应的字符型的缓冲流的BufferedReader和BufferedWriter流程基本上一致。只是操作while的时候不太一致
String s=null;
while((s=br.readLine())!=null){
bw.writer(s);
bw.newLine();
bw.flush();}
因为是字符的操作,这里可以一行一行的读数据和写数据。
注意到一点,缓冲流的谢操作需要一个flush()刷新和newLine()来进行下一行的操作。基本上的操作流程都差不多。