缓冲流
- BufferedInputStream
- BufferedOutputStream
- BufferedReader
- BufferedWriter
缓冲流(处理流)
处理流:“套接”在已有流的基础上
缓冲流是在原有流的基础上,进行包装
作用:提供流的读取,写入的速度
提高读写速度的原因:内部提供了一个缓冲区
/**
* 缓冲流
* BufferedInputStream
* BufferedOutputStream
* BufferedReader
* BufferedWriter
*
* 作用:提供流的读取,写入的速度
* 提高读写速度的原因:内部提供了一个缓冲区
*
*/
public class Mybuffered {
/**
* 实现非文本文件的复制
*/
@Test
public void BufferedStreamTest(){
FileInputStream fis= null;
FileOutputStream fos= null;
BufferedInputStream bis= null;
BufferedOutputStream bos= null;
try {
//造文件
File srcFile=new File("123.jpg");
File destFile=new File("789.jpg");
//节点流
fis = new FileInputStream(srcFile);
fos = new FileOutputStream(destFile);
//缓冲流
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
//复制细节,读取,写入
byte[] buf=new byte[1024];
int len;
while((len=bis.read(buf))!=-1){
bos.write(buf,0,len);
// bos.flush();//刷新缓冲区
}
} catch (IOException e) {
e.printStackTrace();
} finally {
/**
* 资源的关闭,要先关断外层流,再关内层流
* 但是:我们关掉外层流时,也会关闭内层流,所以我们可以省略内层流的关闭
*/
try {
if (bis!=null)
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(bos!=null)
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
1,和节点流不同的是,我们在使用缓存流时,要创建需要包装的流,读写操作是用的是缓冲流,具体看上面代码
2,为什么能提高读写呢?因为buffered类提供一个缓冲区容量为8192, 动态的.flush()。意思就是,原本当我们的缓冲区存储到了8192,就会打印刷新,但buffered会自动的刷新,把内存中的数据打印出去。
资源的关闭,要先关断外层流,再关内层流
但是:我们关掉外层流时,也会关闭内层流,所以我们可以省略内层流的关闭
接下来我们来操作文本文件:
@Test
public void textBuffered(){
BufferedReader br= null;
BufferedWriter bw= null;
try {
br = new BufferedReader(new FileReader(new File("hello.txt")));
bw = new BufferedWriter(new FileWriter(new File("hello1.txt")));
///步骤3
char[] cbuf=new char[1024];
int len;
while((len=br.read(cbuf))!=-1){
bw.write(cbuf,0,len);
}
//////
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br!=null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(bw!=null)
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
没有特别大的区别:
但是我们的步骤三可以改写为:
String data;
while((data=br.readLine())!=null){
bw.write(data+"\n");
//bw.write(data);
//bw.newLine();
}
注意.readLine()返回的不是-1,读到文件末尾返回的是null
readLine():意思是按行来读取,但是readLine()中不包含换行符,所以我们要加个“\n”,避免全部内容挤在一行
也可以用bw.write(data);
bw.newLine();(表示换行符)