缓冲流BufferedOutputStream使用步骤

博客介绍了缓冲流,包括字节缓冲流和字符缓冲流,指出缓冲流是对基本FileXxx流的增强,通过创建内置缓冲区数组减少系统IO次数,提高读写效率。重点讲解了字节缓冲输出流的构造方法,还提及了其使用代码及释放资源等内容。

缓冲流也叫高效流,是对基本的FileXxx流的增强

字节缓冲流:BufferedInputStream,BufferedOutputStream

字符缓冲流:BufferedReader,BufferedWriter

缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少

系统IO次数,从而提高读写的效率

字节缓冲流:

构造方法:

BufferedInputStream​(InputStream in)

创建一个 BufferedInputStream并保存其参数,输入流 in供以后使用。

BufferedOutputStream​(OutputStream out)

创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

 

 java.io.BufferedOutputStream extends OutputStream

BufferedOutputStream:字节缓冲输出流

有继承自父类的共性成员方法:(子类继承父类,可以使用父类的成员方法)

voidclose​()

关闭此输出流并释放与此流相关联的任何系统资源。

voidflush​()

刷新此输出流并强制任何缓冲的输出字节被写出。

voidwrite​(byte[] b)

b.length字节从指定的字节数组写入此输出流。

voidwrite​(byte[] b, int off, int len)

从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。

abstract voidwrite​(int b)

将指定的字节写入此输出流。

 OutputStream的构造方法:

 

构造方法  
Constructor描述
BufferedOutputStream​(OutputStream out)

创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

BufferedOutputStream​(OutputStream out, int size)

创建一个新的缓冲输出流,以便以指定的缓冲区大小将数据写入指定的底层输出流。

 参数:

OutputStream out:字节输出流 可以传递FileOutputStream,缓冲流会给FileOutputStream增加一个缓冲区,提高FileOutputStream的写入效率

int size:指定缓冲流内部缓冲区大小,不指定默认

BufferedOutputStream使用步骤:

1、创建FileOutputStream(字节输出流)对象,构造方法中绑定要输出的目的地

2、创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象,提高FileOutputStream的写入效率

3、使用BufferedOutputStream对象中的方法write方法,把数据写入到内部缓冲区中

4、使用BufferedOutputStream对象中的flush,把内部缓冲区的数据,刷新到文件中

5、释放资源(会先调用flush方法刷新数据,第4步可以省略)

 

字节缓冲输出流的使用代码

package com.baidu.Buffered;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Buffered01 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos= new FileOutputStream("F:\\develop\\buffered.txt");
        BufferedOutputStream bos=new BufferedOutputStream(fos);
        bos.write("菠萝吹雪也有春天呢".getBytes());
        bos.close();

    }

}

 

 

 

<think>嗯,用户想了解缓冲流在计算机编程中的作用及使用方法。首先需要明确缓冲流的基本概念,它是内存中的一块区域,用于临时存放数据,减少对物理设备的直接访问次数,从而提高效率。用户可能是在学习Java IO流时遇到了这个概念,或者在实际项目中遇到了性能问题。 接下来,用户的应用场景可能涉及文件读写、网络数据传输等。比如处理大文件时,频繁的磁盘IO会导致性能瓶颈,这时候缓冲流能显著提升速度。用户可能没有明确说出,但深层需求应该是优化程序性能,减少资源消耗。 然后,根据引用[1]和[4],Java中的缓冲流如BufferedInputStream和BufferedWriter通过内置缓冲区减少系统调用次数。需要解释其工作原理,比如默认缓冲区大小8KB,填满后才写入磁盘。同时,用户可能对flush方法的作用有疑问,为什么需要手动刷新,这点要说明缓冲区未满时数据滞留的问题。 用户还提到"在IT领域的应用",引用[2]和[5]提到数据流编程和视频处理中的缓冲技术。这里可以扩展说明缓冲流在多媒体处理中的作用,比如视频帧缓冲避免卡顿,或者AI模型推理时的数据批处理。用户可能想了解不同领域的应用差异,但当前问题聚焦编程,需注意平衡深度和广度。 另外,用户可能混淆了缓冲流与缓存机制,需要区分前者是IO过程的中间层,后者是存储层。引用[3]关于C语言缓冲区的例子可以帮助说明不同语言的共性。 最后,用户的使用方法部分需要具体代码示例,比如Java中如何用BufferedReader逐行读取大文件,同时强调资源关闭的重要性。可能存在的误区是忽略异常处理,导致资源泄漏,这点要提醒。</think>好的,我们来详细探讨一下缓冲流(Buffered Streams)在计算机编程中的概念、作用及使用方法。 ## 缓冲流是什么? 缓冲流是一种**在内存中创建临时数据存储区(缓冲区)的输入/输出流**。它充当在程序与底层数据源(如文件、网络套接字、键盘、屏幕)或数据目的地之间传输数据的“中间人”。 * **核心思想:** 减少程序与物理设备(尤其是慢速设备如磁盘、网络)之间直接交互的次数。 * **工作方式:** * **读操作(输入流):** 当程序请求数据时,缓冲流会尝试一次性从底层源(如硬盘文件)读取一大块数据(例如8KB)放入内存缓冲区。后续程序读取数据时,实际上是直接从这块高速的内存缓冲区中获取,直到缓冲区数据被读完。这时,缓冲流才会再次去底层源读取下一大块数据填充缓冲区。 * **写操作(输出流):** 当程序向流写入数据时,数据首先被写入内存缓冲区。只有当缓冲区满了,或者程序显式调用`flush()`方法时,缓冲流才会一次性将缓冲区中的所有数据写入到底层目的地(如硬盘文件或网络套接字)。 ## 缓冲流在编程中的作用 缓冲流的核心作用就是**显著提升I/O操作的效率**,具体体现在: 1. **减少物理I/O操作次数:** 这是最重要的作用。与每次读写一个字节或几个字节相比,一次性读写一大块数据(缓冲区大小)极大地减少了访问慢速物理设备(如磁盘、网络)的次数。磁盘寻道和网络传输延迟是性能瓶颈的主要来源,减少访问次数能带来巨大的性能提升,尤其是在处理大量数据时。 2. **降低系统开销:** 每次系统调用(如`read()`或`write()`)都需要从用户态切换到内核态,这本身就有一定的开销。缓冲流通过减少系统调用的次数,降低了这种上下文切换的开销。 3. **平滑数据传输:** 对于输出流,缓冲可以平滑程序快速产生小块数据与设备相对较慢的写入速度之间的差异。程序可以继续“快速”写入缓冲区,而设备在后台处理整块数据的写入。对于输入流,缓冲确保了程序在请求数据时,如果缓冲区有数据,可以立即返回,避免等待设备响应。 4. **提供更便捷的API:** 许多缓冲流实现(如Java的`BufferedReader`/`BufferedWriter`)在基础流之上提供了更高级、更方便的方法,例如`readLine()`(一次读取一行文本)或`newLine()`(写入一个换行符),简化了编程。 ## 缓冲流使用方法(以Java为例) 在Java中,缓冲流(`BufferedInputStream`, `BufferedOutputStream`, `BufferedReader`, `BufferedWriter`)是**装饰器类(Decorator)**。它们本身不直接连接到数据源/目的地,而是“包裹”在另一个基础节点流(如`FileInputStream`, `FileOutputStream`, `Socket.getInputStream()`, `Socket.getOutputStream()`)之上,为其添加缓冲功能。 **基本使用步骤:** 1. **创建基础节点流:** 首先创建直接连接到数据源或目的地的流(如文件流、网络流)。 2. **用缓冲流包装节点流:** 将创建好的节点流对象作为参数传递给缓冲流的构造函数。 3. **通过缓冲流进行读写操作:** 后续所有的读写操作都通过缓冲流对象进行。 4. **关闭流:** 操作完成后,关闭缓冲流即可(关闭缓冲流会自动关闭其包装的底层节点流)。这是良好实践,确保资源释放。 ### 代码示例 #### 1. 使用`BufferedInputStream`和`BufferedOutputStream`复制文件(字节流) ```java import java.io.*; public class BufferedCopy { public static void main(String[] args) { try ( // 1. 创建基础节点流 (源文件输入流,目标文件输出流) FileInputStream fis = new FileInputStream("source.jpg"); FileOutputStream fos = new FileOutputStream("copy.jpg"); // 2. 用缓冲流包装节点流 BufferedInputStream bis = new BufferedInputStream(fis); BufferedOutputStream bos = new BufferedOutputStream(fos) ) { // 3. 通过缓冲流读写 (一次读写一个字节数组效率更高) byte[] buffer = new byte[8192]; // 8KB缓冲区 int bytesRead; while ((bytesRead = bis.read(buffer)) != -1) { bos.write(buffer, 0, bytesRead); } // 4. 关闭流 (try-with-resources 自动关闭) System.out.println("文件复制完成!"); } catch (IOException e) { e.printStackTrace(); } } } ``` #### 2. 使用`BufferedReader`和`BufferedWriter`读写文本文件(字符流) ```java import java.io.*; public class BufferedText { public static void main(String[] args) { try ( // 1. 创建基础节点流 (文件字符输入/输出流) FileReader fr = new FileReader("input.txt"); FileWriter fw = new FileWriter("output.txt"); // 2. 用缓冲流包装节点流 BufferedReader br = new BufferedReader(fr); BufferedWriter bw = new BufferedWriter(fw) ) { // 3. 通过缓冲流读写 (使用readLine()一次读取一行) String line; while ((line = br.readLine()) != null) { bw.write(line); // 写入一行 bw.newLine(); // 写入换行符 (BufferedWriter便捷方法) // 注意:这里为了演示清晰,每写一行就flush一次(实际可能降低效率) // bw.flush(); // 如果需要立即写入磁盘(如日志),可手动flush } // 或者一次性写入大量文本后,在最后flush一次 // bw.flush(); // 在循环结束后手动刷新缓冲区,确保所有数据写入文件 // 4. 关闭流 (try-with-resources 自动关闭) System.out.println("文本处理完成!"); } catch (IOException e) { e.printStackTrace(); } } } ``` ### 关键方法说明 * `flush()`: 对于**输出缓冲流**(`BufferedOutputStream`, `BufferedWriter`),调用此方法会**强制将缓冲区中所有尚未写入底层设备的数据立即写出**。在以下情况很重要: * 需要确保数据被立即持久化(例如,写入日志文件,防止程序崩溃丢失重要信息)。 * 在网络通信中,需要立即将数据发送给对方。 * 程序写入大量数据后,在关闭流之前显式`flush()`可以确保所有数据写出(虽然`close()`通常会自动调用`flush()`,但显式调用更安全)。 * **缓冲区大小:** 大多数缓冲流类允许在构造函数中指定缓冲区大小(如`new BufferedInputStream(fis, 16384)` // 16KB缓冲区)。选择合适的缓冲区大小(通常是系统页大小或磁盘块大小的倍数,如4KB, 8KB, 16KB)可以进一步优化性能。默认大小通常为8KB,对于大多数场景已经足够好。 ## 总结 缓冲流是优化程序I/O性能的关键技术。它通过在内存中建立缓冲区,减少了与慢速物理设备(磁盘、网络)的直接交互次数,从而大幅提升读写效率。在Java等语言中,使用缓冲流通常很简单:创建基础节点流,然后用相应的缓冲流类(`BufferedInputStream`, `BufferedOutputStream`, `BufferedReader`, `BufferedWriter`)包装它,之后通过缓冲流进行读写操作,并注意适时使用`flush()`和关闭流。理解缓冲流的原理和正确使用方法是编写高效、健壮I/O代码的基础[^1][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值