【问题标题】:Java OutputStream Skip (offset)Java OutputStream 跳过(偏移量)
【发布时间】:2012-03-04 21:30:11
【问题描述】:

我正在尝试编写一个函数,该函数接受 File 对象、偏移量和字节数组参数,并将该字节数组写入 Java 中的 File 对象。

所以函数看起来像

public void write(File file, long offset, byte[] data)

但是问题是offset参数是long类型,所以不能使用OutputStream的write()函数,它以整数作为偏移量。

与具有skip(long) 的InputStream 不同,OutputStream 似乎无法跳过文件的第一个字节。

有什么好的方法可以解决这个问题吗?

谢谢。

【问题讨论】:

  • 您可以在int 中输入的最大数字是 2,147,483,647。您要写入的数组是否大于 +- 2GB?
  • 只是为了澄清:偏移量只适用于 array 中的位置,而不适用于输出流,对吗?使用 OutputStream 你不能跳过位置。
  • @TheNail 偏移量是指从文件开头的偏移量,而不是数组开头的偏移量。除非您使用 FAT 作为文件系统,否则您确实可以拥有大于 2Gb 的文件。
  • 啊,仅供参考:OutputStream.write() 中的 int 偏移参数 off 是关于数组,而不是流/文件(但我看到已经有一些相关答案)。

标签: java io inputstream outputstream


【解决方案1】:
try {
   FileOutputStream out = new FileOutputStream(file);
   try {
       FileChannel ch = out.getChannel();
       ch.position(offset);
       ch.write(ByteBuffer.wrap(data));
   } finally {
       out.close();
   } 
} catch (IOException ex) {
    // handle error
}

【讨论】:

    【解决方案2】:

    这与流的语义有关。对于输入流,您只是说您正在丢弃前 n 个字节的数据。但是,使用 OutputStream 必须将某些内容写入流。您不能只要求流假装写入了 n 个字节的数据,但实际上并未写入它们。这样做的原因是因为并非所有流都是可搜索的。通过网络传来的数据是不可搜索的——您只能获得一次数据。但是,文件并非如此,因为它们存储在硬盘上,很容易找到硬盘上的任何位置。

    解决方案:使用FileChannelsRandomAccessFile 代替。

    【讨论】:

      【解决方案3】:

      如果您想在文件末尾写入,请使用附加模式(FileOutputStream(String name, boolean append))。以我的拙见,FileOutputStream 中应该有一个跳过方法,但是现在如果您想前往文件中的特定位置进行写入,那么您必须使用可查找的 FileChannel 或 RandomAccessFile(因为它是别人提到的)。

      【讨论】:

        猜你喜欢
        • 2018-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-25
        • 2021-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多