JAVA BufferedOutputStream 刷新速度慢且文件大小正确

标签 java file stream operating-system size

我正在使用 BufferedOutputStream 写入文件。在调试时,我注意到即使操作系统显示文件已获得最终大小,刷新操作也会花费很长时间。

我的理论: BufferedOutputStream告诉操作系统提前预留空间?因此,即使 BufferedOutputStream 尚未完全刷新,操作系统也已经显示了完整文件大小的文件?

这是正确的吗?

最佳答案

BufferedOutputStream 维护其自己的内部byte[] 缓冲区。正在查看implementation of the code ,它只是在将缓冲区写入底层流之前填充该缓冲区。 documentation没有提供更多帮助。

我认为如果不查看每个平台上的 native 实现,您就无法做出比这更多的假设。如果您想获得更多详细信息,您可以运行类似 strace 的命令。并检查一个简单程序发生了什么。

我编写了以下简单的程序

import java.io.*;

public class Test {
    public static void main(String args[]) throws Exception {
        File f = new File("test.txt");
        FileOutputStream fos = new FileOutputStream(f);
        BufferedOutputStream bos = new BufferedOutputStream(fos, 16384);
        for (int i=0;i<10000;++i) {
            bos.write(new byte[1024]);
        }
    }
}

并对其运行strace。确保使用 -f 标志来跟踪子进程。下面显示了运行内容的过滤副本。

[pid  6394] mprotect(0x7fdebc03e000, 4096, PROT_READ|PROT_WRITE) = 0
[pid  6394] open("test.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
[pid  6394] fstat(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
[pid  6394] mprotect(0x7fdebc03f000, 16384, PROT_READ|PROT_WRITE) = 0
[pid  6394] write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\"...,    16384) = 16384
[pid  6394] write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\"...,    16384) = 16384
[pid  6394] write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\"...,    16384) = 16384

我没有看到任何预先预留空间的调用(请注意 mprotect 完全确定,但它似乎不相关)。我在 Linux 机器上看到的行为只是一个缓冲区被填充并写入磁盘。

关于JAVA BufferedOutputStream 刷新速度慢且文件大小正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5803775/

相关文章:

php - 使用php读取文件中的一行

c - C程序读取文件读取额外的一行

java - 客户端无法从服务器接收信息

java - mysql-connector 8.0需要通过 `Class.forName()`注册驱动程序吗?

Java 更新 UIManager 默认值并重绘组件

python - CSV 字符串到 Python 中的 JSON

C# 如何将流复制到 streamwriter

Node.js 流可读转换

java - ArrayList 图书搜索

java - JSP 页面与标签输出分离