【问题标题】:Java Fill preallocated File with Data (on drive)Java 用数据填充预分配的文件(在驱动器上)
【发布时间】:2013-05-16 12:58:57
【问题描述】:

我想从网上下载一个视频文件。它是 121 MB。现在我想在磁盘上预先分配这 121 MB(用零或任何东西),并用来自 urlconnection 的输入流的数据逐步填充它。或者换句话说:已经下载了多少并不重要 - 文件大小始终是指定的 121MB。

有可能吗? 谢谢

【问题讨论】:

  • 是的,有可能,但如果你不先尝试,你不可能得到答案。
  • 我知道我可以创建一个特定大小的空文件。但是如果我将数据写入这个虚拟文件(通过文件输出流),它将被覆盖,并且它的大小将更新为当前下载的数据。
  • 为什么不呢?只需打开文件并写入您的零/填充数据(易于循环)。

标签: java file allocation diskspace


【解决方案1】:

我得到了解决方案。首先我写一个空的虚拟文件,然后我重新打开空文件并替换字节:

    System.out.println("Writing dummy ...");
    byte buf[] = new byte[1024];
    for (int size = 0; size < fileLength; size += buf.length) {
        out.write(buf);
        out.flush();
    }
    out.close();

    System.out.println("Writing data ...");
    RandomAccessFile raf = new RandomAccessFile(temp, "rw");
    int count = 0;
    long total = 0;
    while ((count = stream.read(buf)) > 0) {
        raf.seek(total);
        raf.write(buf);
        total += count;
    }
    raf.close();

【讨论】:

    【解决方案2】:

    显然。创建文件,写入循环,将 121*1024*1024 字节写入此文件。您可以逐字节写入或使用块。从性能的角度来看,块是更可取的。

    这里是演示代码:

    byte[] bytes = new byte[1024]; // 1KB array.
    OutputStream os = new FileOutputStream(myFilePath);
    for (int size = 0; size < 121*1024*1024; size += bytes.length;) {
        os.write(b);
        os.flush();
    }
    os.close();
    

    【讨论】:

    • 感谢您的快速回复,但这不是我的意思。我想创建一个“容器”(什么都没有填充的文件)并用视频数据填充它。即使尚未下载,我也希望文件为 121MB。
    猜你喜欢
    • 2015-01-16
    • 1970-01-01
    • 2012-04-05
    • 2015-07-07
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多