1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.compress.archivers.zip;
18
19 import java.io.IOException;
20 import java.nio.ByteBuffer;
21 import java.nio.channels.SeekableByteChannel;
22
23
24
25
26
27 class SeekableChannelRandomAccessOutputStream extends RandomAccessOutputStream {
28
29 private final SeekableByteChannel channel;
30
31 SeekableChannelRandomAccessOutputStream(final SeekableByteChannel channel) {
32 this.channel = channel;
33 }
34
35 @Override
36 public synchronized void close() throws IOException {
37 channel.close();
38 }
39
40 @Override
41 public synchronized long position() throws IOException {
42 return channel.position();
43 }
44
45 @Override
46 public synchronized void write(final byte[] b, final int off, final int len) throws IOException {
47 ZipIoUtil.writeFully(this.channel, ByteBuffer.wrap(b, off, len));
48 }
49
50 @Override
51 public synchronized void writeFully(final byte[] b, final int off, final int len, final long position) throws IOException {
52 final long saved = channel.position();
53 try {
54 channel.position(position);
55 ZipIoUtil.writeFully(channel, ByteBuffer.wrap(b, off, len));
56 } finally {
57 channel.position(saved);
58 }
59 }
60 }