Java
Python前端运维数据库
Java
Java
  • 新特性
    • Record
    • Optional
  • 面向对象
    • 面向对象基础
    • 构造方法
    • 继承与多态
    • 接口
    • 修饰符
    • 代码块
    • 接口(Interface)
    • 枚举类
  • IO流
    • IO
      • 字节流
      • 字符流
      • 缓冲流
      • 转换流
      • 操作ZIP
      • File 对象
    • NIO
      • Channel和Buffer
      • 异步文件通道AsynchronousFileChannel
      • Selector
      • Path/Files/Pipe
  • 反射
  • 内存分配
  • 集合
    • 简介
    • List
    • Set
    • Map
    • EnumMap
  • 日期与时间
    • Date和Calendar
    • Java8 新时间 ✨
      • LocalDateTime
      • ZonedDateTime
      • Duration
    • 时间格式化
      • SimpleDateFromat
      • DateTimeFormatter ✨
    • Instant
    • 实践
  • 网络编程
    • IP 地址
    • 网络模型
    • TCP 编程
    • UDP 编程
    • HTTP 编程
  • 加密和安全
  • 并发编程
    • 多线程
    • 线程与进程的区别
    • 线程组和线程优先级
    • 线程池
    • 线程锁
  • 异步任务
    • Future
    • CompletableFuture
      • 开启异步任务
      • 串行任务方法
      • 并行任务方法
      • 任务结束方法
      • 异常处理方法
      • 查看状态方法
      • 设置任务结果方法
  • 执行系统命令
  • Stream 流
    • Stream 流的创建
    • Stream 流串行与并行
    • Stream 流中间操作
    • Stream 流终端操作
  • Lambda 表达式
    • Lambda 表达式简介
    • Lambda 表达式语法
    • 方法引用
  • String
  • StringBuffer
由 GitBook 提供支持
在本页
  • 字节缓冲流
  • BufferInputStream
  • BufferOutputStream
  • 案例
  • 为什么字节缓冲流这么快?
  • 字符缓冲流
  • BufferedReader
  • BufferedWriter

这有帮助吗?

  1. IO流
  2. IO

缓冲流

缓冲流是对字节流和字符流的一种封装,通过在内存中开辟缓冲区来提高I/O操作的效率,Java 通过BufferedInputStream和BufferedOutputStream来实现字节流的缓冲,通过 BufferedReader 和 BufferedWriter 来实现字符流的缓冲。

缓冲流的工作原理是将数据先写入缓冲区,当缓冲区满时再一次性写入文件或输出流,或者当缓冲区为空时,一次性从文件或输入流读取一定量的数据。这样可以减少I/O操作的次数,提高程序运行的效率。

字节缓冲流

BufferInputStream

BufferedInputStream类与其他输入流一起使用,可以更有效地读取数据(以字节为单位)。

它扩展了InputStream抽象类。

BufferedInputStream维护 8192 字节的内部缓冲区。内部缓冲区的默认大小为8192字节。我们也可以自定内部缓冲区的大小。

在BufferedInputStream中进行读取操作期间,将从磁盘读取一部分字节并将其存储在内部缓冲区中。 并从内部缓冲区中逐个读取字节。

BufferedInputStream buffer = new BufferInputStream(file, int size);
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("test.txt"));

BufferOutputStream

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.txt"));

案例

long startTime = System.currentTimeMillis();
try (FileInputStream fileInputStream = new FileInputStream("a.mp4");
     FileOutputStream fileOutputStream = new FileOutputStream("b.mp4")
) {
    int tmp;
    while ((tmp = fileInputStream.read()) != -1) {
        fileOutputStream.write(tmp);
    }
}
long endTime = System.currentTimeMillis();
System.out.println("复制时间" + (endTime - startTime) + "ms");
long startTime2 = System.currentTimeMillis();
try (
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("a.mp4"));
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("c.mp4"))
) {
    int tmp;
    while ((tmp = bufferedInputStream.read()) != -1) {
        bufferedOutputStream.write(tmp);
    }
}
long endTime2 = System.currentTimeMillis();
System.out.println("复制时间" + (endTime2 - startTime2) + "ms");
long startTime3 = System.currentTimeMillis();
try (
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("a.mp4"));
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("c.mp4"))
) {
    int tmp;
    byte[] bytes = new byte[5 * 1024];
    while ((tmp = bufferedInputStream.read(bytes)) != -1) {
        bufferedOutputStream.write(bytes, 0, tmp);
    }
}
long endTime3 = System.currentTimeMillis();
System.out.println("复制时间" + (endTime3 - startTime3) + "ms");

通过上述的三个案例可以明显的发现,使用缓冲流进行文件的读写操作时,速度明显的要快很多,要想速度更快的话,可以通过设置读取的字节数组来调整。

为什么字节缓冲流这么快?

传统的 IO 是阻塞式的,他的工作状态就是读写、等待、读写......,以此循环。

字节缓冲流通过一次多读点多写点,减少读写的频率,从而提高程序执行效率,属于用空间换时间。

  • 减少系统调用次数:在使用字节缓冲流时,数据不是立即写入

  • 减少磁盘读写次数:

  • 提高数据传输效率:

字符缓冲流

BufferedReader

BufferedWriter

try (FileInputStream fileInputStream = new FileInputStream("input.txt");
     FileOutputStream fileOutputStream = new FileOutputStream("output.txt");
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
     BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream))
) {
    int tmp;
    while ((tmp = bufferedReader.read()) != -1) {
        bufferedWriter.write(tmp);
    }
} catch (IOException e) {
    e.printStackTrace();
}

上一页字符流下一页转换流

最后更新于5个月前

这有帮助吗?