java学习笔记:IO流之字节缓冲流BufferedInputStream, BufferedOutputStream
四、字节缓冲流
字节流一次读写一个数组的速度比一次读写一个字节的速度快很多,这是加了数组这样的缓冲区效果。所以java提供了字节缓冲区流。
BufferedOutputStream: 字节缓冲输出流
BufferedInputStream: 字节缓冲输入流
2.构造方法
BufferedOutputStream(OutputStream out);
使用这种构造方法,它提供了一个默认的缓冲区大小,所以一般我们使用默认的缓冲区就可以了。
为什么构造方法传递的是一个OutputStream,而不是具体的文件或路径呢?因为字节缓冲区流仅仅提供缓冲区,而真正的底层的读写数据还得需要基本的流对象进行操作。
代码示例:
FileOutputStream fos = new FileOutputStream("a.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
上述两行代码等价于:BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt"));
bos.close();//释放资源
3.写数据
bos.write(65);//写一个字节
bos.write("abcdefg".getBytes());//写一个字节数组
bos.write("abcdefg".getBytes(), 0, 4);//写一个字节数组的一部分
4.构造方法
BufferedInputStream(InputStream in);
代码示例:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
读取方式1:一次读取一个字节
int by;
while((by = bis.read()) != -1){
System.out.print((char)by);
}
读取方式2:一次读取一个字节数组
int len;
byte[] bys = new byte[1024];
while((len = bis.read(bys)) != -1){
System.out.print(new String(bys, 0, len));
}
//释放资源
bis.close();
5.字节流复制文件的效率
System类的public static long currentTimeMillis();//返回以毫秒为单位的当前时间
long start = System.currentTimeMillis();//记录开始时间
...//待测试效率的代码,如:methodA()
long end = System.currentTimeMillis();//记录结束时间
共耗时 = end - start;//毫秒
设计四个方案:
方案A:基本字节流,一次读写一个字节
方案B:基本字节流,一次读写一个字节数组
方案C:缓冲字节流,一次读写一个字节(要求记住)
方案D:缓冲字节流,一次读写一个字节数组(要求记住)
代码:
//方案A:基本字节流,一次读写一个字节
private static void methodA() throws IOException{
//封装数据源
FileInputStream fis = new FileInputStream("d:\\复制图片.avi");
//封装目的地
FileOutputStream fos = new FileOutputStream("copy.avi");
int by;
while((by = fis.read()) != -1){
fos.write((char)by);
}
fos.close();
fis.close();
}//方案B:基本字节流,一次读写一个字节数组
private static void methodB() throws IOException{
//封装数据源
FileInputStream fis = new FileInputStream("d:\\复制图片.avi");
//封装目的地
FileOutputStream fos = new FileOutputStream("copy.avi");
byte[] bys = new byte[1024];
int len;
while((len = fis.read(bys)) != -1){
fos.write(bys, 0, len);
}
fos.close();
fis.close();
}//方案C:缓冲字节流,一次读写一个字节(要求记住)
private static void methodC() throws IOException{
//封装数据源
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:\\复制图片.avi"));
//封装目的地
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.avi"));
int by;
while((by = bis.read()) != -1){
bos.write((char)by);
}
bos.close();
bis.close();
}//方案D:缓冲字节流,一次读写一个字节数组(要求记住)
private static void methodD() throws IOException{
//封装数据源
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:\\复制图片.avi"));
//封装目的地
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.avi"));
byte[] bys = new byte[1024];
int len;
while((len = bis.read(bys)) != -1){
bos.write(bys, 0, len);
}
bos.close();
bis.close();
}