java核心技术之IO流(四)BufferedInputStream和BufferedOutputStream

最后更新于:2022-04-01 09:58:46

### 简单的说明 一般小的字节(byte)文件的读取和写入数据,我们使用FileInputStream和FileOutputStream类就可以实现了,但是对于大的字节(byte)文件的读取和写入数据,性能就会有很大的问题,我们一般选择BufferedInputStream和BufferedOutputStream来处理,也就是说BufferedInputStream和BufferedOutputStream主要的目的是提高字节(byte)文件的内容读取和写入的性能。 ### BufferedInputStream和BufferedOutputStream ### BufferedInputStream类 构造方法: BufferedInputStream(InputStream in) 创建一个有32字节的缓存区 BufferedInputStream(InputStream in, int size) 创建一个有size大小字节的缓存区 关键方法: read() read(byte[] buffer, int byteOffset, int byteCount) 常用使用方式: ~~~ BufferedInputStream buf = new BufferedInputStream(new FileInputStream("file.java")); ~~~ ### BufferedOutputStream类 构造方法: BufferedOutputStream(OutputStream out) BufferedOutputStream(OutputStream out, int size) 关键方法: write(int oneByte) write(byte[] buffer, int offset, int length) flush() 主要是用来把缓存区的数据刷新到文件中去 常用使用方式: ~~~ BufferedOutputStream buf = new BufferedOutputStream(new FileOutputStream("file.java")); ~~~ ### 一个测试的Demo 定义三个方法: (1)testBufferedInputStream方法—读取文件内容 BufferedInputStream的使用方法: ~~~ //1.创建一个输入字符文件 //2.定义一个输入流FileInputStream //3.定义一个BufferedInputStream //4.输入操作 //5.关闭对应的流,注意,可以只关闭最外面的流 ~~~ (2)testBufferedOutputStream方法—-往文件写内容 BufferedOutputStream的使用方法: ~~~ //1.创建一个File文件 //2.定义一个输出流 //3.定义一个BufferedOutputStream //4.输出操作 //5.关闭对应的流,注意,可以只关闭最外面的流 ~~~ (3)copyFile方法—-复制文件的方法 ~~~ //1.定义输入和输出的文件 //2.定义二个输入输出流 //3.定义二个输入输出缓存流 //4.实现复制功能 //5.关闭对应的流,缓存流的时候,可以只关闭对应的缓存流就可以,先关输出缓存流,再关输入缓存流 ~~~ ~~~ import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class BufferedInputStreamBufferedOutputStream { //使用BufferedInputStream和BufferedOutputStream,实现文件的复制功能 public static void copyFile(String src,String des,int lenByte){ //3.定义二个输入输出缓存流 BufferedInputStream bis = null; BufferedOutputStream bos = null; try { //1.定义输入和输出文件 File fin = new File(src); File fout = new File(des); //2.定义二个输入输出流 FileInputStream fis = new FileInputStream(fin); FileOutputStream fos = new FileOutputStream(fout); bis = new BufferedInputStream(fis); bos = new BufferedOutputStream(fos); //4.实现复制功能 byte[] b = new byte[lenByte]; int len; while((len = bis.read(b))!= -1){ bos.write(b, 0, len); bos.flush(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ //5.关闭对应的流,缓存流的时候,可以只关闭对应的缓存流就可以,先关输出缓存流,再关输入缓存流 if (bos != null) { try { bos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (bis != null) { try { bis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } //BufferedOutputStream使用样例 public static void testBufferedOutputStream(){ //3.定义一个BufferedOutputStream BufferedOutputStream bos = null; try { //1.定义输出File //File fin = new File("music_01.mp3"); File fout = new File("BufferedOutputStream.txt"); //2.定义一个输出流 FileOutputStream fos = new FileOutputStream(fout); bos = new BufferedOutputStream(fos); //4.输出操作 String str = "BufferedOutputStream使用样例"; bos.write(str.getBytes()); fos.flush(); }catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }finally{ //5.关闭对应的流,注意,可以只关闭最外面的流 if(bos != null){ try { bos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } //BufferedInputStream使用样例 public static void testBufferedInputStream(){ //3.定义一个BufferedInputStream BufferedInputStream bis = null; try { //1.定义输入File //File fin = new File("music_01.mp3"); File fin = new File("hello.txt"); //2.定义一个输入流 FileInputStream fis = new FileInputStream(fin); bis = new BufferedInputStream(fis); //4.输入操作 byte[] b = new byte[16]; int len; while((len = bis.read(b)) != -1){ System.out.println(new String(b, 0,len)); } }catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }finally{ //5.关闭对应的流,注意,可以只关闭最外面的流 if(bis != null){ try { bis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } ~~~ 调用: ~~~ //BufferedInputStream使用样例 BufferedInputStreamBufferedOutputStream.testBufferedInputStream(); //BufferedOutputStream使用样例 BufferedInputStreamBufferedOutputStream.testBufferedOutputStream(); //使用BufferedInputStream和BufferedOutputStream,实现文件的复制功能 long t1 = System.currentTimeMillis(); BufferedInputStreamBufferedOutputStream.copyFile("music_01.mp3","music_02.mp3",1024);//10M大小的音乐 long t2 = System.currentTimeMillis(); System.out.print("复制文件消耗的时间:"+(t2 - t1));//10-4437 100-431 1024-60 ~~~ 说明: 测试来复制一个10M大小的音乐文件(music_01.mp3),使用缓存流在一次复制10byte时要4437毫秒,一次复制100byte时要431毫秒,一次复制1024byte时要60毫秒。 参考资料: 1.BufferedOutputStream api文档 android_sdk_docs_offline/reference/java/io/BufferedOutputStream.html 2.BufferedInputStream文档 android_sdk_docs_offline/reference/java/io/BufferedInputStream.html 3.BufferedOutputStream与BufferedInputStream视频 [http://edu.csdn.net/course/detail/805/10967?auto_start=1](http://edu.csdn.net/course/detail/805/10967?auto_start=1)
';