在Java中创建给定大小的文件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/245251/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 11:58:57  来源:igfitidea点击:

Create file with given size in Java

javafile

提问by Benedikt Waldvogel

Is there an efficientway to create a file with a given size in Java?

有没有一种有效的方法可以在 Java 中创建具有给定大小的文件?

In C it can be done with ftruncate(see that answer).

在 C 中,它可以用ftruncate来完成(见答案)。

Most people would just write ndummy bytes into the file, but there must be a faster way. I'm thinking of ftruncateand also of Sparse files

大多数人只会将n 个虚拟字节写入文件,但必须有更快的方法。我在考虑ftruncate稀疏文件……

采纳答案by Diomidis Spinellis

Create a new RandomAccessFileand call the setLength method, specifying the desired file length. The underlying JRE implementation should use the most efficient method available in your environment.

创建一个新的RandomAccessFile并调用 setLength 方法,指定所需的文件长度。底层 JRE 实现应该使用您的环境中可用的最有效的方法。

The following program

下面的程序

import java.io.*;

class Test {
     public static void main(String args[]) throws Exception {
           RandomAccessFile f = new RandomAccessFile("t", "rw");
           f.setLength(1024 * 1024 * 1024);
     }
}

on a Linux machine will allocate the space using the ftruncate(2)

在 Linux 机器上将使用 ftruncate(2) 分配空间

6070  open("t", O_RDWR|O_CREAT, 0666)   = 4
6070  fstat(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
6070  lseek(4, 0, SEEK_CUR)             = 0
6070  ftruncate(4, 1073741824)          = 0

while on a Solaris machine it will use the the F_FREESP64 function of the fcntl(2) system call.

而在 Solaris 机器上,它将使用 fcntl(2) 系统调用的 F_FREEP64 函数。

/2:     open64("t", O_RDWR|O_CREAT, 0666)               = 14
/2:     fstat64(14, 0xFE4FF810)                         = 0
/2:     llseek(14, 0, SEEK_CUR)                         = 0
/2:     fcntl(14, F_FREESP64, 0xFE4FF998)               = 0

In both cases this will result in the creation of a sparse file.

在这两种情况下,这都会导致创建稀疏文件。

回答by Greg Hewgill

You can open the file for writing, seek to offset (n-1), and write a single byte. The OS will automatically extend the file to the desired number of bytes.

您可以打开文件进行写入、查找偏移量 (n-1) 并写入单个字节。操作系统会自动将文件扩展到所需的字节数。

回答by mandev

Since Java 8, this method works on Linux and Windows :

从 Java 8 开始,此方法适用于 Linux 和 Windows:

final ByteBuffer buf = ByteBuffer.allocate(4).putInt(2);
buf.rewind();

final OpenOption[] options = { StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW , StandardOpenOption.SPARSE };
final Path hugeFile = Paths.get("hugefile.txt");

try (final SeekableByteChannel channel = Files.newByteChannel(hugeFile, options);) {
    channel.position(HUGE_FILE_SIZE);
    channel.write(buf);
}