处理流就是包在其它流上面的流(有时包在节点流之外, 节点流就是直接和数据源连接的流),处理流不是直接和数据源连接,而是从数据源读取到数据以后再通过处理流处理一遍。
缓冲流也包含了四个类:BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter。
package cn.com.jlu.test;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
public class BufferReaderWriterDemo {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
bufferedWriterReaderDemo();
}
public static void bufferedInputOutputDemo() throws IOException{
long start=System.currentTimeMillis();
InputStream fin=new FileInputStream(new File("E:\\zhangsan\\song.mp3"));
OutputStream fio=new FileOutputStream(new File("E:\\aaa.mp3"));
BufferedInputStream bis=new BufferedInputStream(fin);
BufferedOutputStream bio=new BufferedOutputStream(fio);
int len=-1;
byte[] b=new byte[1024*1024];
while((len=bis.read(b))!=-1)
{
bio.write(b, 0, len);
}
fin.close();
fio.close();
long end=System.currentTimeMillis();
System.out.println("总共耗时:"+(end-start)+"毫秒");
}
/**
* 通过节点流FileWriter,外面包着处理流BufferedWriter来将内容写入到文件当中,并
* 通过节点流FileReader,外面包着处理流BufferedReader来从文件中读取内容。
* 将缓冲区当作桥梁
* @throws IOException
*/
public static void bufferedWriterReaderDemo() throws IOException
{
Writer w=new FileWriter(new File("E:\\zhangsan\\la.txt"));
//往里面写入内容
BufferedWriter biw=new BufferedWriter(w);
biw.write("I have a pen,I have a pencil");
//写入一个行分隔符。
biw.newLine();
biw.write("apple and pineapple");
//刷新该流的缓冲,将缓冲区的数据立刻写出来
biw.flush();
Reader r=new FileReader("E:\\zhangsan\\la.txt");
//FileReader一次只读取一个字节,BufferedReader将读取的内容放到内存的缓冲区里面,等缓冲区满了在读取
BufferedReader bir=new BufferedReader(r);
String str="";
while((str=bir.readLine())!=null)
{
System.out.println(str);
}
biw.close();
bir.close();
}
}
字节流与字符流的区别
字节流和字符流使用是非常相似的,那么除了操作代码的不同之外,还有哪些不同呢?
字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的
字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容
那开发中究竟用字节流好还是用字符流好呢?
在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。
如果要java程序实现一个拷贝功能,应该选用字节流进行操作(可能拷贝的是图片),并且采用边读边写的方式(节省内存)。