Java输出流跳过(偏移)

Java输出流跳过(偏移),java,io,inputstream,outputstream,Java,Io,Inputstream,Outputstream,我正在尝试编写一个函数,该函数接受File对象、offset和byte数组参数,并将该byte数组写入Java中的File对象 所以函数看起来像 public void write(File file, long offset, byte[] data) 但问题是offset参数是long类型,所以我不能使用OutputStream的write()函数,它将整数作为偏移量 与具有skip(long)的InputStream不同,OutputStream似乎无法跳过文件的第一个字节 有没有解决这

我正在尝试编写一个函数,该函数接受File对象、offset和byte数组参数,并将该byte数组写入Java中的File对象

所以函数看起来像

public void write(File file, long offset, byte[] data)
但问题是offset参数是long类型,所以我不能使用OutputStream的write()函数,它将整数作为偏移量

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

有没有解决这个问题的好办法


谢谢。

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


解决方案:使用或insteead。

如果要在文件末尾写入,请使用追加模式(FileOutputStream(字符串名称,布尔追加))。依我的拙见,FileOutputStream中应该有一个skip方法,但是现在如果你想在文件中的某个特定位置进行写入,那么你必须使用可搜索的FileChannel或RandomAccessFile(正如其他人提到的那样)。

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