View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   https://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  
20  package org.apache.commons.compress.archivers.zip;
21  
22  import java.io.IOException;
23  import java.io.OutputStream;
24  
25  /**
26   * Abstraction over OutputStream which also allows random access writes.
27   */
28  // Keep package-private; consider for Apache Commons IO.
29  abstract class RandomAccessOutputStream extends OutputStream {
30  
31      /**
32       * Gets the current position in this stream.
33       *
34       * @return current position.
35       * @throws IOException if an I/O error occurs
36       */
37      abstract long position() throws IOException;
38  
39      @Override
40      public void write(final int b) throws IOException {
41          write(new byte[] { (byte) b });
42      }
43  
44      /**
45       * Writes all given bytes at a position.
46       *
47       * @param position position in the stream
48       * @param bytes    data to write
49       * @param offset   offset of the start of data in param bytes
50       * @param len      the length of data to write
51       * @throws IOException if an I/O error occurs.
52       */
53      abstract void writeAll(byte[] bytes, int offset, int len, long position) throws IOException;
54  
55      /**
56       * Writes all given bytes at a position.
57       *
58       * @param position position in the stream
59       * @param bytes    data to write
60       * @throws IOException if an I/O error occurs.
61       */
62      void writeAll(final byte[] bytes, final long position) throws IOException {
63          writeAll(bytes, 0, bytes.length, position);
64      }
65  }