我正在尝试编写一个函数,该函数接受File对象,偏移量和字节数组参数,并将该字节数组写入Java中的File对象。
所以函数看起来像
public void write(File file, long offset, byte[] data)
但问题是offset参数是long类型,所以我不能使用OutputStream的write()函数,它将整数作为偏移量。
与跳过(long)的InputStream不同,似乎OutputStream无法跳过文件的第一个字节。
有解决这个问题的好方法吗?
谢谢。
答案 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个字节的数据,而不是实际写入它们。这是因为并非所有流都可以搜索。通过网络传输的数据是不可搜索的 - 您只能获取一次数据。但是,文件不是这样,因为它们存储在硬盘驱动器上,很容易找到硬盘上的任何位置。
解决方案:使用FileChannels或RandomAccessFile insteead。
答案 2 :(得分:1)
如果要在文件末尾写入,请使用追加模式(FileOutputStream(String name,boolean append))。在我看来,FileOutputStream中应该有一个skip方法,但是现在你想要前往文件中的特定位置进行写入,那么你必须使用可搜索的FileChannel或RandomAccessFile(因为它是其他人提到。)