字节缓存流
字节缓存流有两个。一个是BufferedOutputStream,该类实现缓存输出流。另一个是BufferedInputStream,该类提高了读写效率
首先我们学习一下BufferedOutputStream类,该类是具体类,该类继承了FilterOutputStream 该类的爷爷是OutputStream类,所以该类是字节输出流 该类的所有实现接口为:Closeable、Flushable、AutoCloseable
该类实现了缓冲流。通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用
该类的构造方法如下 BufferedOutputStream(OutputStream out) 创建新的缓冲输出流以将数据写入指定的基础输出流 BufferedOutputStream(OutputStream out, int size) 创建新的缓冲输出流,以使用指定的缓冲区大小将数据写入指定的基础输出流
该类向另一个输入流添加功能,即缓冲输入并支持mark和reset方法的功能。 创建BufferedInputStream将创建内部缓冲区阵列。 当读取或 跳过来自流的字节时,内部缓冲区根据需要从包含的输入流中重新填充,一次多个字节。 mark操作会记住输入流中的一个点,并且reset操作会导致在 从包含的输入流中获取新字节之前重新读取自最近的mark操作以来读取的所有字节
该类的构造方法 BufferedInputStream(InputStream in) 创建一个BufferedInputStream并保存其参数,即输入流 in ,供以后使用 BufferedInputStream(InputStream in, int size) 创建具有指定缓冲区大小的BufferedInputStream,并保存其参数(输入流in)供以后使用
为什么构造方法需要的是字节流,而不是具体的文件或者路径?如下 因为:字节缓冲流静静提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作
字节缓存流的练习
xxxxxxxxxx
package ch19;
import java.io.*;
//可选中BufferedOutputStream或BufferedInputStream,再按Ctrl+B查看这两个构造方法的源码
public class a_1_1测试 {
public static void main(String[] args) throws IOException {
//字节缓存输出流:BufferedOutputStream(OutputStream out)
//因为上面那行需要的参数是OutputStream,所以要先创建OutputStream对象,如下
//FileOutputStream fos = new FileOutputStream("D:\\huanf\\java\\src\\ch18_储物区\\bos.txt");
//创建BufferedOutputStream对象,字节缓冲输出流
//BufferedOutputStream bos = new BufferedOutputStream(fos);
//上面的两行代码也可以合并为一下,如下
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\huanf\\java\\src\\ch18_ch19_储物区\\bos.txt"));
//写数据
bos.write("hello\r\n".getBytes());
bos.write("world\r\n".getBytes());
bos.write("12123132asefasdfFSDFD".getBytes());
//释放资源
bos.close();
//------------------------------------------------------------------------------------------------------------------
//读数据,需要使用的是BufferedInputStream类,如下
//BufferedInputStream(InputStream in) 创建一个BufferedInputStream并保存其参数,即输入流 in ,供以后使用
//因为上面那行需要的参数是InputStream,所以要先创建InputStream对象,如下直接用合并的写法
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\huanf\\java\\src\\ch18_ch19_储物区\\bos.txt"));
//读数据,一次读取一个字节数据
int by;
while ((by= bis.read())!=-1){ //注意这里是全读,就把数据读完。如果想看到下面那个读数据的效果,就把这个读数据给注释掉
System.out.print((char)by);//注意这里不是println即输出不换行
}
System.out.println("--------------------");
//读数据,一次读取一个字节数组的数据。想看这种读数据的效果,就把上面那一种注释掉,不然这种不显示
byte[] bys = new byte[1024];
int len;
while((len=bis.read(bys))!=-1){
System.out.print(new String(bys,0,len));
}
//释放资源
bis.close();
}
}
字节流复制视频
package ch19;
//这里我们使用四种方式实现复制视频,并记录每种方式复制视频的时间,四种方式如下
//1、基本字节流:一次读写一个字节
//2、基本字节流:一次读写一个字节数组
//3、字节缓冲流:一次读写一个字节
//4、字节缓冲流:一次读写一个字节数组
import java.io.*;
public class a_2_1测试 {
//注意报红线就抛出异常
public static void main(String[] args) throws IOException {
//记录开始时间
long startTime = System.currentTimeMillis();
//复制视频,这里我们使用四种方式实现,方式写在了main函数的外面,下面的四种调用用一种就行,注释其他三种
//method1();//这种需要6888毫秒就可以把对应视频文件复制过去
//method2();//这种需要11毫秒就可以把对应视频文件复制过去
//method3();//这种需要15毫秒就可以把对应视频文件复制过去
method4();//这种需要4毫秒就可以把对应视频文件复制过去
//记录结束时间
long endTime = System.currentTimeMillis();
System.out.println("共耗时: "+(endTime-startTime)+"毫秒");
}
//----------------------------------------------------------------------------------------------------------------
//四种方式实现复制视频,如下
//1、基本字节流:一次读写一个字节。这种方式复制视频比较慢,即过程比较久
public static void method1() throws IOException {
//把数据源封装成对象
FileInputStream fis = new FileInputStream("D:\\huanf\\java\\src\\ch18_ch19_储物区\\视频.avi");
//把目的地封装成对象
FileOutputStream fos = new FileOutputStream("D:\\huanf\\java\\src\\ch18_ch19_储物区\\JavaSE\\视频.avi");
//一次读写一个字节
int by;
while ((by=fis.read())!=-1){
fos.write(by);
}
//释放资源
fos.close();
fis.close();
}
//------------------------------------------------------------------------------------------------------------------
//2、基本字节流:一次读写一个字节数组
public static void method2() throws IOException {
//把数据源封装成对象
FileInputStream fis = new FileInputStream("D:\\huanf\\java\\src\\ch18_ch19_储物区\\视频.avi");
//把目的地封装成对象
FileOutputStream fos = new FileOutputStream("D:\\huanf\\java\\src\\ch18_ch19_储物区\\JavaSE\\视频.avi");
//一次读写一个字节数组
byte[] bys = new byte[1024];
int len;
while ((len=fis.read(bys))!=-1){
fos.write(bys,0,len);
}
//释放资源
fos.close();
fis.close();
}
//------------------------------------------------------------------------------------------------------------------
//3、字节缓冲流:一次读写一个字节
public static void method3() throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\huanf\\java\\src\\ch18_ch19_储物区\\视频.avi"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\huanf\\java\\src\\ch18_ch19_储物区\\JavaSE\\视频.avi"));
//一次读写一个字节
int by;
while ((by=bis.read())!=-1){
bos.write(by);
}
//释放资源
bos.close();
bis.close();
}
//-----------------------------------------------------------------------------------------------------------------
//4、字节缓冲流:一次读写一个字节数组
public static void method4() throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\huanf\\java\\src\\ch18_ch19_储物区\\视频.avi"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\huanf\\java\\src\\ch18_ch19_储物区\\JavaSE\\视频.avi"));
//一次读写一个字节数组
byte[] bys = new byte[1024];
int len;
while ((len=bis.read(bys))!=-1){
bos.write(bys,0,len);
}
//释放资源
bos.close();
bis.close();
}
//----------------------------------------------------------------------------------------------------------------
//复制速度最快总结:method4>method2>method3>method1,其中4最快1最慢
}