Java访问大文件

Posted

技术标签:

【中文标题】Java访问大文件【英文标题】:Java access to big file 【发布时间】:2009-06-23 15:00:04 【问题描述】:

我正在寻找一种有效的方法来创建大小未知但范围从 mb 到 gb 的文件并随机填充其内容。我可能会写前 200 个字节,而不是跳到最后并写最后 200 个字节,然后移到中间并在那里写。 RandomAccessFile 这样做是否有效,或者有没有更适合这种工作的替代方案?

【问题讨论】:

【参考方案1】:

是的,使用RandomAccessFile - 这就是它的用途。您可以使用FileChannel,但我会先使用RandomAccessFile - 它可能更简单。

请注意,在写完结尾部分后,您将无法“插入到文件的中间”:我不知道任何支持该文件的文件系统。基本上,在编写最后一部分之前,您需要知道完整的大小。另一种方法是顺序写入,记住最后一位直到结束。

如果您可以向我们提供有关您需要做什么的更多信息(以及当您获得有关尺寸的信息时),我们可能会为您提供更多帮助。

编辑:要创建具有特定大小的文件,您可以 seek() 过去然后写入数据:

import java.io.*;

public class Test

    // Just for the sake of a simple test program!
    public static void main(String[] args) throws Exception
    
        RandomAccessFile file = new RandomAccessFile("file.dat", "rw");

        file.seek(100);
        file.write(0);
        file.close();
    

退出后,file.dat 的长度为 101 个字节。 (请注意,通常你会使用 try/finally 等)

编辑:正如 cmets 中提到的 coobird,setLength() 也会扩展文件 - 但如果您给出的长度小于当前大小,它也会截断文件。鉴于您对基本上编写洪流数据的评论,我怀疑寻找然后写入正是您想要的行为。当您收到一个块时,只需寻找正确的位置,将其写出来,文件就会在需要时自行扩展。

【讨论】:

除了迭代和写入全零或全一个来填充它之外,有没有办法创建具有前缀大小的文件? 谢谢,我必须在文件中写入随机部分的原因是我正在实现一个 torrent 客户端,并且碎片将到达文件中的随机位置,但我事先知道文件的大小整个文件将是。 @Jon Skeet:RandomAccessFile.setLength 方法怎么样?它表示如果新指定的大小大于当前大小,它将扩展文件(但是,用于填充扩展部分的数据未定义)。在这种情况下可以吗? 大多数现代操作系统不会在磁盘上分配扇区,直到您将一些数据实际写入文件中的某个位置。因此,torrent 客户端提供了预先分配文件的选项,以避免稍后在随机块到达时造成磁盘损坏。【参考方案2】:

RandomAccessFile 应该这样做

【讨论】:

【参考方案3】:

我猜 RandomAccessFile 可以解决这个问题

【讨论】:

以上是关于Java访问大文件的主要内容,如果未能解决你的问题,请参考以下文章

Java大文件分片上传/多线程上传方案

Java实现浏览器端大文件分片上传技术

Java实现浏览器端大文件分片上传技术

JavaNIO的深入研究4内存映射文件I/O,大文件读写操作,Java nio之MappedByteBuffer,高效文件/内存映射

php处理大文件文件

即时访问大文件中的行,无需加载文件