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速度快。

相关文章
|
3月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
55 1
|
3月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
132 1
|
5月前
|
Java
Java系列之 字符串和字节互转
这篇文章是关于Java中字符串和字节之间互转的方法,包括使用`getBytes()`方法将字符串转换为字节数组,以及使用String构造方法将字节数组转换回字符串。
|
5月前
|
存储 缓存 Java
15 Java IO流(File类+IO流+字节流+字符流+字节编码)
15 Java IO流(File类+IO流+字节流+字符流+字节编码)
62 3
|
5月前
|
缓存 Java 数据处理
|
6月前
|
分布式计算 Java 调度
MaxCompute产品使用合集之使用Tunnel Java SDK上传BINARY数据类型时,应该使用什么作为数据类字节
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
7月前
|
存储 编解码 安全
一篇文章讲明白java字符流字节流
一篇文章讲明白java字符流字节流
32 0
|
7月前
|
存储 自然语言处理 Java
Java IO流完全手册:字节流和字符流的常见应用场景分析!
【6月更文挑战第26天】Java IO流涵盖字节流和字符流,字节流用于二进制文件读写及网络通信,如图片和音频处理;字符流适用于文本文件操作,支持多语言编码,确保文本正确性。在处理数据时,根据内容类型选择合适的流至关重要。
105 0
|
7月前
|
自然语言处理 Java
Java IO流进阶教程:掌握字节流和字符流的高级用法!
【6月更文挑战第26天】Java IO流助你高效交换数据,包括字节流(InputStream/OutputStream)和字符流(Reader/Writer)的高级技巧。缓冲流(Buffered*)提升读写性能,对象流(Object*Stream)支持对象序列化。字符流的BufferedReader/BufferedWriter优化文本处理,注意字符集如UTF-8用于编码转换。掌握这些,优化IO操作,提升代码质量。
63 0
|
7月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
【6月更文挑战第26天】Java IO流涵盖字节流与字符流。字节流(InputStream/OutputStream)处理数据单位为字节,适用于二进制和文本,而字符流(Reader/Writer)专注于文本,处理单位为字符,处理编码转换。字符流在字节流基础上添加编码处理,以装饰器模式实现。文件复制示例展示了两者区别:字节流直接复制所有数据,字符流处理字符编码。理解并选择适当流类型对优化程序至关重要。
165 0