在Java中,BufferedOutputStream
是一种用于包装其他输出流(如 FileOutputStream
)的过滤流。它通过内部缓冲区机制提高了输出流处理的效率。使用缓冲流可以减少写入数据的次数,因为每次向输出流写入数据时,BufferedOutputStream
会将数据写入到内部的缓冲区中,当缓冲区满时,它会一次性将缓冲区中的数据写入到底层输出流,从而减少了磁盘I/O操作的次数。 以下是 BufferedOutputStream
的几个关键点:
- 内部维护一个缓冲区,默认大小为8192字节(8KB)。
- 当缓冲区满时,会自动将缓冲区中的数据写入到底层输出流。
- 当调用
flush()
方法时,会强制将缓冲区中的数据写入到底层输出流,即使缓冲区未满。 - 当调用
close()
方法时,它也会先调用flush()
,然后关闭底层输出流。
下面是一个使用 BufferedOutputStream
的示例代码:
java
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedOutputStreamExample {
public static void main(String[] args) {
// 文件路径,这里假设要写入的文件名为example.txt
String filePath = "example.txt";
// 创建FileOutputStream对象用于写入文件
FileOutputStream fileOutputStream = null;
// 创建BufferedOutputStream对象,包装FileOutputStream
BufferedOutputStream bufferedOutputStream = null;
try {
// 初始化FileOutputStream
fileOutputStream = new FileOutputStream(filePath);
// 初始化BufferedOutputStream,可以指定缓冲区大小,这里使用默认大小
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
// 要写入的字符串
String content = "Hello, World! This is a test of BufferedOutputStream.";
// 将字符串转换为字节并写入缓冲输出流
byte[] data = content.getBytes();
bufferedOutputStream.write(data);
// 强制刷新缓冲区,确保所有数据都写入到文件
bufferedOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭流
if (bufferedOutputStream != null) {
try {
bufferedOutputStream.close(); // 关闭BufferedOutputStream也会关闭底层的FileOutputStream
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
代码解释:
-
创建了一个
FileOutputStream
对象用于向文件写入字节流。 -
创建了一个
BufferedOutputStream
对象,将FileOutputStream
作为参数传递给其构造器,这样BufferedOutputStream
就会包装FileOutputStream
。 -
将要写入的字符串转换为字节,然后使用
write
方法写入BufferedOutputStream
。 -
调用
flush
方法确保所有缓冲区中的数据都被写入到底层输出流。 -
使用
finally
块确保在程序结束前关闭BufferedOutputStream
,它会自动关闭被包装的FileOutputStream
。 同样,从Java 7开始,可以使用try-with-resources语句简化资源管理,这样就不需要显式地关闭流了。以下是使用try-with-resources的示例:
java
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedOutputStreamExample {
public static void main(String[] args) {
// 文件路径
String filePath = "example.txt";
// 使用try-with-resources语句自动管理资源
try (FileOutputStream fileOutputStream = new FileOutputStream(filePath);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream)) {
// 要写入的字符串
String content = "Hello, World! This is a test of BufferedOutputStream.";
// 将字符串转换为字节并写入缓冲输出流
byte[] data = content.getBytes();
bufferedOutputStream.write(data);
// 强制刷新缓冲区,确保所有数据都写入到文件
bufferedOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个改进的版本中,FileOutputStream
和 BufferedOutputStream
都在try-with-resources的括号内声明,这样它们在try块执行完毕后就会自动关闭。这样代码更加简洁,并且能够确保资源得到正确管理。