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

x33g5p2x  于2021-03-13 发布在 Java  
字(4.6k)|赞(0)|评价(0)|浏览(437)

简单的说明

一般小的字节(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

相关文章