Java笔记(16)-缓冲流(高效复制文件)

缓冲流,提高了读写的性能;当然无论如何,必须使用的就是节点流; 如果说单纯使用节点流,我试了一下,复制一个简单的文件,节点流耗时如果是 150左右,而缓冲流耗时大概只有50到60多,基本上缓冲流是节点流的速度的三倍;

1.字节流缓冲复制( BufferedInputStream和BufferedOutputStream)

这个缓冲流的基本用法和之前的字节流差不多,可以理解为不过是在字节流中加了层壳,同样的也增加了数据读取的速度;可以这样理解,就是字节流他就是按规定的字节传输,有时可能很小就开始传输了,但是缓冲流则是必须要那么多字节才会传输一次,比如:搬家,每次搬一点东西,每次都要来回走(这就像是读取硬盘信息),但是一次性多搬一点(节省了来回走动,也就是多次读取的时间),东西愈多,自然愈慢;

public class TestBufferIn {
    public static void main(String[] args) {
        InputStream in = null;
        OutputStream out = null;
        BufferedOutputStream bufferedOutputStream = null;
        BufferedInputStream bufferedInputStream = null;
        try {
            in = new FileInputStream("E:\\IDEA数据\\NOweb\\FIDEA\\FileText\\src\\TextDecurate.java");
            out = new FileOutputStream("copy.txt");
            bufferedInputStream = new BufferedInputStream(in);
            bufferedOutputStream = new BufferedOutputStream(out);
            int lenth = -1;
            byte[] arr = new byte[1024];
            while ((lenth = bufferedInputStream.read(arr)) != -1) {
                bufferedOutputStream.write(arr);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bufferedOutputStream.close();
                bufferedInputStream.close();

           /*     public void close() throws IOException {
                    byte[] buffer;
                    while ( (buffer = buf) != null) {
                        if (bufUpdater.compareAndSet(this, buffer, null)) {
                            InputStream input = in;//这里很明显是找到了输入流的节点流,
                            in = null;
                            if (input != null)
                                input.close();//在节点流中数据不为空的情况下,这里也对节点流进行关闭;
                            return;//所以归根结底,处理流的关闭,就是关闭他所对应的节点流;
                        }*/

//这后面两个其实不需要再次关闭,我们可以看看处理流close源码;如上:
//                in.close();
//                out.close();


            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2.字符缓冲流复制(BufferReader和BufferWriter)

这个字符缓冲流,和之前的字符流复制也差不多,可以理解为在之前的字符流外面添加了一个缓冲流的壳;

public class TestBufferWR {

    public void CopyFile(FileWriter write, FileReader reader) {
        //定义一个liner用来查看是否复制完毕
        String liner = null;
        //将两个字符流放入到缓冲流中去,这里使用的是try-with-resource
        try (BufferedReader breader = new BufferedReader(reader);
             BufferedWriter bwriter = new BufferedWriter(write)) {
            //开始复制文件;
            while ((liner = breader.readLine()) != null) {
                bwriter.write(liner);
                bwriter.newLine();
            }
            bwriter.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        TestBufferWR tb = new TestBufferWR();
        try {
            //定义文件存放路径,只能是字符文件;
            FileReader reader = new FileReader("./FileText/src/TextFile.java");
            FileWriter writer = new FileWriter("CopyText.txt");
            tb.CopyFile(writer, reader);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/dxsdcyy/article/details/105883552
今日推荐