答案 1
创建一个新的 RandomAccessFile 并调用 setLength 方法,指定所需的文件长度。基础 JRE 实现应使用环境中可用的最有效方法。
以下程序
import java.io.*;
class Test {
public static void main(String args[]) throws Exception {
RandomAccessFile f = new RandomAccessFile("t", "rw");
f.setLength(1024 * 1024 * 1024);
}
}
在 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
而在 Solaris 机器上,它将使用 fcntl(2) 系统调用的 F_FREESP64 函数。
/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
在这两种情况下,这都将导致创建稀疏文件。
答案 2
从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);
}
推荐
-
-
如何在Java EE环境中管理数据库和文件系统的事务? 我将文件的属性(大小,更新时间等)存储在数据库中。所以问题是如何管理数据库和文件的事务。 在Java EE环境中,JTA只能管理数据库事务。如果更新数据库成功但文件操作失败,我是否应该
-
java.io.File(父级、子级)无法按预期工作 我正在尝试基于用户提供的文件名(可以是绝对的或相对的)和依赖于环境的基目录来构造Java File对象。java.io.File(File parent, String child)的java doc说如下: 如果子路径名字符串是绝对的,则
-
在 java 中写入文件期间进行 IOException 处理 我的应用不断将大量字节写入文件。如果我的一个代码块正在写出字节,并且如果与驱动器或网络的连接丢失,则获得IOException,我怎么知道它写了多少字节? 例如,我一次写入2500个字节,如
-