1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    *
5    *
6    *
7    * The contents of this file are subject to the terms of the Liferay Enterprise
8    * Subscription License ("License"). You may not use this file except in
9    * compliance with the License. You can obtain a copy of the License by
10   * contacting Liferay, Inc. See the License for the specific language governing
11   * permissions and limitations under the License, including but not limited to
12   * distribution rights of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portal.kernel.io.unsync;
24  
25  import java.io.IOException;
26  import java.io.OutputStream;
27  
28  /**
29   * <a href="UnsyncBufferedOutputStream.java.html"><b><i>View Source</i></b></a>
30   *
31   * <p>
32   * See http://support.liferay.com/browse/LPS-6648.
33   * </p>
34   *
35   * @author Shuyang Zhou
36   */
37  public class UnsyncBufferedOutputStream extends UnsyncFilterOutputStream {
38  
39      public UnsyncBufferedOutputStream(OutputStream outputStream) {
40          this(outputStream, _DEFAULT_BUFFER_SIZE);
41      }
42  
43      public UnsyncBufferedOutputStream(OutputStream outputStream, int size) {
44          super(outputStream);
45  
46          buffer = new byte[size];
47      }
48  
49      public void flush() throws IOException {
50          if (count > 0) {
51              outputStream.write(buffer, 0, count);
52  
53              count = 0;
54          }
55  
56          outputStream.flush();
57      }
58  
59      public void write(byte[] byteArray, int offset, int length)
60          throws IOException {
61  
62          if (length >= buffer.length) {
63              if (count > 0) {
64                  outputStream.write(buffer, 0, count);
65  
66                  count = 0;
67              }
68  
69              outputStream.write(byteArray, offset, length);
70  
71              return;
72          }
73  
74          if (count > 0 && length > buffer.length - count) {
75              outputStream.write(buffer, 0, count);
76  
77              count = 0;
78          }
79  
80          System.arraycopy(byteArray, offset, buffer, count, length);
81  
82          count += length;
83      }
84  
85      public void write(byte[] byteArray) throws IOException {
86          write(byteArray, 0, byteArray.length);
87      }
88  
89      public void write(int b) throws IOException {
90          if (count >= buffer.length) {
91              outputStream.write(buffer, 0, count);
92  
93              count = 0;
94          }
95  
96          buffer[count++] = (byte)b;
97      }
98  
99      protected byte[] buffer;
100     protected int count;
101 
102     private static int _DEFAULT_BUFFER_SIZE = 8192;
103 
104 }