gpt4 book ai didi

java - 为什么 FileOutputStream 不会抛出 OutOfMemoryException

转载 作者:行者123 更新时间:2023-12-02 08:34:42 25 4
gpt4 key购买 nike

我已经在 Windows(64 位)和 Linux(32 位)上尝试了下面的代码。

我确信如果没有 BufferedOutputStream,代码必然会抛出 OutOfMemoryException,但事实并非如此。

这是为什么呢?谁在磁盘上执行{缓存/缓冲/流化}?

如果与答案相关,您能否描述一下完整的流程(Java API -> 系统调用)?

这段代码使用NIO吗?

/我很困惑。

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class WriteHugeFileToDisk {
private static int BYTE = 1;
private static int KILBYTE = BYTE * 1024;
private static int MEGABYTE = KILBYTE * 1024;
private static int GIGABYTE = MEGABYTE * 1024;
private static long TERABYTE = GIGABYTE * 1024L;

public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream(args[0]);
DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream);

byte[] buffer = new byte[MEGABYTE];
for(int i = 0; i < buffer.length; i++) {
buffer[i] = (byte)i;
}

for(long l = 0; l < 4000; l++) {
dataOutputStream.write(buffer);
;
}

}
}

我使用 Java 6 运行了此代码。使用以下调用:

Windows:

java WriteHugeFileToDisk %TEMP%\hi.txt

Linux:

java WriteHugeFileToDisk /mnt/hi.info

请注意:代码创建了 4GB 的文件,仅用于测试。

最佳答案

为什么会抛出OutOfMemoryException?它只是写入磁盘。如果 FileOutputStreamDataOutputStream一些缓冲(我没有检查),我不会感到惊讶,但它们肯定不需要缓冲你写的一切

这段代码没有直接使用 NIO,尽管如果某些内部东西使用了我也不会感到惊讶。至于涉及哪些系统调用以及何时进行 - 这将是特定于实现的,但重要的是要认识到 DataOutputStreamFileOutputStream 都不是为了缓冲所有内容。您向它们写入一些数据,其中一些数据可能会写入磁盘。如果您刷新或关闭流,那么您迄今为止写入的所有数据都应该到达磁盘。如果您刷新或关闭流,我预计只会缓存相当少量(同样,特定于实现的)(如果有的话)。

请注意,BufferedOutputStream 确实引入了缓存 - 但仅限于您要求的数量(或默认值)。同样,它不会缓冲所有内容,除非您要求与写入数据一样多的缓冲区。

关于java - 为什么 FileOutputStream 不会抛出 OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3273352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com