字节缓存流
字节缓存流有两个。一个是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)供以后使用
为什么构造方法需要的是字节流,而不是具体的文件或者路径?如下 因为:字节缓冲流静静提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作
字节缓存流的练习
xxxxxxxxxxpackage 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最慢
}