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   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  package org.apache.commons.crypto.stream.output;
19  
20  import java.io.IOException;
21  import java.io.OutputStream;
22  import java.nio.ByteBuffer;
23  
24  import org.apache.commons.crypto.stream.CryptoOutputStream;
25  
26  /**
27   * The StreamOutput class takes a {@link OutputStream} object and wraps it
28   * as {@link Output} object acceptable by {@link CryptoOutputStream}
29   * as the output target.
30   */
31  public class StreamOutput implements Output {
32      private final byte[] buf;
33      private final int bufferSize;
34      private final OutputStream out;
35  
36      /**
37       * Constructs a new instance.
38       *
39       * @param out the OutputStream object.
40       * @param bufferSize the buffer size.
41       */
42      public StreamOutput(final OutputStream out, final int bufferSize) {
43          this.out = out;
44          this.bufferSize = bufferSize;
45          buf = new byte[bufferSize];
46      }
47  
48      /**
49       * Overrides the {@link Output#close()}. Closes this output and releases any
50       * system resources associated with the under layer output.
51       *
52       * @throws IOException if an I/O error occurs.
53       */
54      @Override
55      public void close() throws IOException {
56          out.close();
57      }
58  
59      /**
60       * Overrides the {@link Output#flush()}. Flushes this output and forces any
61       * buffered output bytes to be written out if the under layer output method
62       * support.
63       *
64       * @throws IOException if an I/O error occurs.
65       */
66      @Override
67      public void flush() throws IOException {
68          out.flush();
69      }
70  
71      /**
72       * Gets the output stream.
73       *
74       * @return the output stream.
75       */
76      protected OutputStream getOut() {
77          return out;
78      }
79  
80      /**
81       * Overrides the
82       * {@link org.apache.commons.crypto.stream.output.Output#write(ByteBuffer)}.
83       * Writes a sequence of bytes to this output from the given buffer.
84       *
85       * @param src The buffer from which bytes are to be retrieved.
86       *
87       * @return The number of bytes written, possibly zero.
88       * @throws IOException if an I/O error occurs.
89       */
90      @Override
91      public int write(final ByteBuffer src) throws IOException {
92          final int len = src.remaining();
93  
94          int remaining = len;
95          while (remaining > 0) {
96              final int n = Math.min(remaining, bufferSize);
97              src.get(buf, 0, n);
98              out.write(buf, 0, n);
99              remaining = src.remaining();
100         }
101 
102         return len;
103     }
104 }