【问题标题】:Create file with given size in Java在Java中创建给定大小的文件
【发布时间】:2008-10-28 23:26:31
【问题描述】:

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

在 C 语言中,它可以通过 ftruncate 完成(参见 that answer)。

大多数人只会将 n 个虚拟字节写入文件,但必须有更快的方法。我在想ftruncateSparse files...

【问题讨论】:

    标签: java file


    【解决方案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
    

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

    【讨论】:

    • 您是如何记录这些库调用跟踪的? ^^
    • 它们是系统调用跟踪。我在 Linux 下使用 strace(1),在 Solaris 下使用 truss(1)。
    • 我希望任何值得称道的操作系统(包括 Windows 和 Linux)都将字节归零,以避免泄露属于另一个用户的旧数据。但是,我可以想到不会出现这种情况的场景:属于同一进程的旧数据,或小型 (J2ME) 平台。
    • 太棒了。我用它在“SD 卡已满”条件下测试了一个 Android 应用!
    • @Sandeep 这是不正确的。 Javadoc 明确指出“未定义文件扩展部分的内容”。零可能是特定平台上的行为。
    【解决方案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);
    }
    

    【讨论】:

    • 非常感谢@mandev。像魅力一样工作!
    【解决方案3】:

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

    【讨论】:

    • 生成的文件会稀疏吗?
    • sk:一般来说,是的。在实践中,这取决于底层操作系统的具体情况,并且可能需要进行一些调整才能使文件稀疏。
    • 在 Unix 和 Linux 上,这将是一个稀疏文件 - 除了写入的单个字节(当然也可能为零)之外,还有一个零字节块。
    • 在 Windows (NTFS) 和 OS-X (HFS+) 上,您不会得到稀疏文件。
    猜你喜欢
    • 2020-09-14
    • 2010-09-13
    • 1970-01-01
    • 2011-12-19
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多