Java OutputStream Skip(offset)

时间:2012-03-04 21:30:12

标签: java io inputstream outputstream

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

所以函数看起来像

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

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

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

有解决这个问题的好方法吗?

谢谢。

3 个答案:

答案 0 :(得分:13)

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
}

答案 1 :(得分:4)

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

解决方案:使用FileChannelsRandomAccessFile insteead。

答案 2 :(得分:1)

如果要在文件末尾写入,请使用追加模式(FileOutputStream(String name,boolean append))。在我看来,FileOutputStream中应该有一个skip方法,但是现在你想要前往文件中的特定位置进行写入,那么你必须使用可搜索的FileChannel或RandomAccessFile(因为它是其他人提到。)