so_*_*_ju 9 java io inputstream outputstream
我正在尝试编写一个函数,它接受File对象,偏移量和字节数组参数,并将该字节数组写入Java中的File对象.
所以函数看起来像
public void write(File file, long offset, byte[] data)
Run Code Online (Sandbox Code Playgroud)
但问题是offset参数是long类型,所以我不能使用OutputStream的write()函数,它将整数作为偏移量.
与跳过(长)的InputStream不同,似乎OutputStream无法跳过文件的第一个字节.
有没有好办法解决这个问题?
谢谢.
小智 14
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
}
Run Code Online (Sandbox Code Playgroud)
这与流的语义有关。对于输入流,您只是说您正在丢弃数据的前 n 个字节。但是,使用 OutputStream 必须将某些内容写入流。你不能只要求流假装写入了 n 个字节的数据,但实际上并不写入它们。这样做的原因是因为并非所有流都是可查找的。通过网络传来的数据是不可查找的——您只能获得一次数据。但是,文件并非如此,因为它们存储在硬盘驱动器上,并且很容易查找到硬盘驱动器上的任何位置。
解决方案:使用FileChannels或RandomAccessFile代替。