【问题标题】:Java, convert file stream to random-access fileJava,将文件流转换为随机访问文件
【发布时间】:2012-08-05 20:17:48
【问题描述】:

我需要在 2 个我无法做任何更改的接口之间实现一个包装器。基本上,包装器需要将 java 风格的流文件访问转换为标准 C 风格的 fopen/fread/fwrite/ 文件访问(在 java 中实现)。

包装器必须实现调用者所需的随机文件访问方法,即open/read/write/close/seek/flush/size/truncate;包装器必须调用一组标准的 java 文件流方法来馈送调用者,被调用者为我提供输入流和输出流。

我看到了 java.io.RandomAccessFile,它将 C 风格转换为 java 流风格,我需要一些相反的东西。最困难的部分是 seek()。有什么好的(有效的)方法吗?

【问题讨论】:

  • 您可以将整个流数据传输到内存缓冲区(ByteArrayOutputStream 将自动增长;toByteArray 将返回底层byte[]),然后您可以对其进行随机访问。 ..但这是一个骇人听闻的解决方案。
  • Pramod 给了我第一个非常有用的评论。 Pramod,你会创建一个答案而不是评论,以便我可以给你信用吗?谢谢。

标签: java file stream java-io


【解决方案1】:

使用 Channels 实用程序类很容易实现这一点...

// STEP 1:  Create random access file read-only
RandomAccessFile raf = new RandomAccessFile("/text.txt", "r");

// STEP 2:  Use Channels to convert to InputStream
InputStream is = Channels.newInputStream(raf.getChannel());

【讨论】:

    【解决方案2】:

    随机访问流的唯一方法是将其缓冲在内存中(或作为磁盘上的副本)

    我也建议

    • 将其读入 ByteArrayOutputStream 并将其转换为 byte[]
    • 将流复制到临时文件(最好是 tmpfs 或 ram 驱动器),然后在其上使用 RandomAccessFile。

    【讨论】:

    • 读入字节数组就像 byte[] org.apache.commons.io.FileUtils.readFileToByteArray(File file) ... 但是当文件大小超过可用内存时这将不起作用。您可以使用“Channels.newInputStream(randomAccessFile.getChannel());”轻松地将 RandomAccessFile 转换为流...我将在单独的答案中详细说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多