在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
Create file with given size in Java
提问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).
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…
采纳答案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);
}