Java字节流之使用字节缓冲流

简介: 笔记

一、使用字节缓冲流


BufferedInputStream和BufferedOutputStream称为字节缓冲流,使用字节缓冲流内置了一个缓冲区,第 一次调用read方法时尽可能多地从数据源读取数据到缓冲区,后续再到用read方法时先看看缓冲区中是 否有数据,如果有则读缓冲区中的数据,如果没有再将数据源中的数据读入到缓冲区,这样可以减少 直接读数据源的次数。通过输出流调用write方法写入数据时,也先将数据写入到缓冲区,缓冲区满了 之后再写入数据目的地,这样可以减少直接对数据目的地写入次数。使用了缓冲字节流可以减少I/O操 作次数,提高效率。

BufferedInputStream的父类是FilterInputStream,BufferedOutputStream的父类是 FilterOutputStream,FilterInputStream和FilterOutputStream称为过滤流。过滤流的作用是扩展其他流, 增强其功能。那么BufferedInputStream和BufferedOutputStream增强了缓冲能力。

过滤流实现了装饰器(Decorator)设计模式,这种设计模式能够在运行时扩充一个类的功 能。而继承在编译时扩充一个类的功能。

BufferedInputStream和BufferedOutputStream中主要方法都是继承自InputStream和OutputStream。下面介绍一下它们的构造方法。

BufferedInputStream构造方法主要有:


BufferedInputStream(InputStream in):通过一个底层输入流in对象创建缓冲流对象,缓冲区大小 是默认的,默认值8192。

BufferedInputStream(InputStream in, int size):通过一个底层输入流in对象创建缓冲流对象,size 指定的缓冲区大小,缓冲区大小应该是2的n次幂,这样可提供缓冲区的利用率。

BufferedOutputStream构造方法主要有:


BufferedOutputStream(OutputStream out):通过一个底层输出流out 对象创建缓冲流对象,缓冲区 大小是默认的,默认值8192。

BufferedOutputStream(OutputStream out, int size):通过一个底层输出流out对象创建缓冲流对象, size指定的缓冲区大小,缓冲区大小应该是2的n次幂,这样可提高缓冲区的利用率。

案例代码如下:

import java.io.*;
public class FileCopyWithBuffer {
    public static void main(String[] args) {
//        创建文件输入流,底层流,通过它构造缓冲输入流
        try(FileInputStream in = new FileInputStream("/Users/caizhengjie/Desktop/qq/123.txt");
            BufferedInputStream bis = new BufferedInputStream(in);
            FileOutputStream out = new FileOutputStream("/Users/caizhengjie/Desktop/qq/asd/1234.txt");
//            构造缓冲输出流
            BufferedOutputStream bos = new BufferedOutputStream(out)){
//           开始时间
            long starttime = System.nanoTime();
//            准备一个缓冲区,这个缓冲区与缓冲区内置的缓冲区不同,决定是否进行I/O操作的次数的是缓冲区内置的缓冲区,不是次缓冲区
            byte[] buffer = new byte[1024];
//            首先读取一次
            int len = bis.read(buffer);
            while (len!=-1){
//                开始写入数据
                bos.write(buffer,0,len);
//                再读取一次
                len = bis.read(buffer);
            }
//            结束时间
            long elapsedTime = System.nanoTime()-starttime;
            System.out.println("耗时"+(elapsedTime/1000000.0)+"毫秒");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行时间:

耗时0.030161毫秒


FileCopy与FileCopyWithBuffer复制相同文件src.zip,缓冲区buffer都设置1024

FileCopy运行时间:

耗时0.246213毫秒

由此可见使用缓冲流的FileCopyWithBuffer明显要比不使 用缓冲流的FileCopy速度快。

相关文章
|
1月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
35 1
|
1月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
81 1
|
3月前
|
Java
Java系列之 字符串和字节互转
这篇文章是关于Java中字符串和字节之间互转的方法,包括使用`getBytes()`方法将字符串转换为字节数组,以及使用String构造方法将字节数组转换回字符串。
|
3月前
|
存储 缓存 Java
15 Java IO流(File类+IO流+字节流+字符流+字节编码)
15 Java IO流(File类+IO流+字节流+字符流+字节编码)
53 3
|
3月前
|
缓存 Java 数据处理
|
4月前
|
分布式计算 Java 调度
MaxCompute产品使用合集之使用Tunnel Java SDK上传BINARY数据类型时,应该使用什么作为数据类字节
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
5月前
|
存储 编解码 安全
一篇文章讲明白java字符流字节流
一篇文章讲明白java字符流字节流
23 0
|
5月前
|
存储 自然语言处理 Java
Java IO流完全手册:字节流和字符流的常见应用场景分析!
【6月更文挑战第26天】Java IO流涵盖字节流和字符流,字节流用于二进制文件读写及网络通信,如图片和音频处理;字符流适用于文本文件操作,支持多语言编码,确保文本正确性。在处理数据时,根据内容类型选择合适的流至关重要。
75 0
|
5月前
|
自然语言处理 Java
Java IO流进阶教程:掌握字节流和字符流的高级用法!
【6月更文挑战第26天】Java IO流助你高效交换数据,包括字节流(InputStream/OutputStream)和字符流(Reader/Writer)的高级技巧。缓冲流(Buffered*)提升读写性能,对象流(Object*Stream)支持对象序列化。字符流的BufferedReader/BufferedWriter优化文本处理,注意字符集如UTF-8用于编码转换。掌握这些,优化IO操作,提升代码质量。
52 0
|
安全 Java Go
Java---字节输入,文件操作,病毒制造,请谨慎运行!
今天刚刚学了Java文件操作,跟着老师的思路,迫不及待的制造了这个小病毒。 用到的是一些小知识,很简单。 创建文件和文件夹,向文件中写入字节。 我已渐渐的爱上了编程!!! 下面附上完整代码: import java.
769 0
下一篇
无影云桌面