在 Java 中创建包含随机字节的 2GB 文件的最快方法是什么?

问题描述 投票:0回答:3

我想要一种在 Java 中生成包含随机位的文件的方法。什么会最快地创建随机文件? 我想创建包含随机位的任何指定大小的文件。 我希望能够在几分钟内(如果可能的话不到一分钟)生成一个 2GB 的文件。 我现在使用的技术需要几个小时才能完成 2GB:

...
private static Random r = new Random();

private static int rand(int lo, int hi) {
    int n = hi - lo + 1;
    int i = r.nextInt() % n;
    if (i < 0) {
        i = -i;
    }
    return lo + i;
}
...
fos = new FileOutputStream(hdFiller);
for(long i = 0; i < maxFileSize; i++) {
    int idx = rand(0,32);
    fos.write(idx);
}
fos.close();
...

必须有一种方法可以更快地完成此操作,甚至可能在一分钟内完成 2GB。

谢谢。

java random byte bit
3个回答
8
投票

如果您想一次性生成随机位,而不是循环,请查看 java.util.Random 方法 nextBytes(byte[]),它用随机字节填充指定的字节数组。创建一个足够大的字节数组来容纳 2GiB 的数据,您可以一次性生成整个随机位源。


4
投票

尝试用 BufferedOutputStream 包装 FileOutputStream。


0
投票

我创建了这个方法来生成具有随机内容的文件。

内存消耗最小,因为我们不将整个文件保存在内存中,而是通过 8K 缓冲区将其写入磁盘。

该文件将位于系统的临时文件夹中,当 JVM 停止时将自动删除。 (我仅在测试中使用它,但如果不需要自动清理,可以修改。)

用法示例:

generateFile(ofGigabytes(2))
。 (如果不使用 spring,只需使用 long 而不是 DataSize 类作为函数参数)。

private static final long DEFAULT_BUFFER_SIZE = ofKilobytes(8).toBytes();

@SneakyThrows
public @NotNull File generateFile(DataSize size) {
    File file = File.createTempFile("test-document-", null);
    file.deleteOnExit();
    try (final var os = new BufferedOutputStream(new FileOutputStream(file))) {
        long numOfBytes = 0;
        final var bytes = new byte[calculateBufferSize(size)];
        final var random = new Random();
        while (numOfBytes < size.toBytes()) {
            random.nextBytes(bytes);
            os.write(bytes);
            numOfBytes += bytes.length;
        }
    }
    return file;
}

private int calculateBufferSize(final DataSize size) {
    if (size.toBytes() > DEFAULT_BUFFER_SIZE) {
        return (int) DEFAULT_BUFFER_SIZE;
    }
    return (int) size.toBytes();
}
© www.soinside.com 2019 - 2024. All rights reserved.