KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > imagero > uio > io > BitOutputStream


1 /*
2  * Copyright (c) Andrey Kuznetsov. All Rights Reserved.
3  *
4  * http://uio.imagero.com
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  * o Redistributions of source code must retain the above copyright notice,
10  * this list of conditions and the following disclaimer.
11  *
12  * o Redistributions in binary form must reproduce the above copyright notice,
13  * this list of conditions and the following disclaimer in the documentation
14  * and/or other materials provided with the distribution.
15  *
16  * o Neither the name of imagero Andrei Kouznetsov nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
29  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */

32
33 package com.imagero.uio.io;
34
35 import java.io.FilterOutputStream JavaDoc;
36 import java.io.IOException JavaDoc;
37 import java.io.OutputStream JavaDoc;
38
39 /**
40  * adds ability to write streams bitewise
41  * @author Andrey Kuznetsov
42  */

43 public class BitOutputStream extends FilterOutputStream JavaDoc {
44
45     static final int[] mask = {0, 1, 3, 7, 15, 31, 63, 127, 255};
46
47     int bitbuf;
48     protected int vbits;
49
50     private int bitsToWrite = 8;
51
52
53     public BitOutputStream(OutputStream JavaDoc out) {
54         super(out);
55     }
56
57     public int getBitsToWrite() {
58         return bitsToWrite;
59     }
60
61     /**
62      * set how much bits should be written to stream every write() call
63      * @param bitsToWrite
64      */

65     public void setBitsToWrite(int bitsToWrite) {
66         this.bitsToWrite = bitsToWrite;
67     }
68
69     /**
70      * Writes some bits (max 8) from the specified int to stream.
71      * @param b int which should be written
72      * @throws IOException if an I/O error occurs
73      * @see #setBitsToWrite
74      * @see #getBitsToWrite
75      */

76     public void write(int b) throws IOException JavaDoc {
77         write(b, bitsToWrite);
78     }
79
80     /**
81      * Writes some bits (max 8) from the specified int to stream.
82      * @param b int which should be written
83      * @param nbits bit count to write
84      * @throws IOException if an I/O error occurs
85      */

86     public void write(int b, int nbits) throws IOException JavaDoc {
87         if (nbits == 0) {
88             return;
89         }
90         final int k = b & mask[nbits];
91         bitbuf = (bitbuf << nbits) | k;
92         vbits += nbits;
93         while (vbits > 8) {
94             int c = bitbuf << (32 - vbits) >>> 24;
95             vbits -= 8;
96             out.write(c);
97         }
98     }
99
100     /**
101      * writes bits from buffer to output stream
102      * @throws IOException if I/O error occurs
103      */

104     public void flush() throws IOException JavaDoc {
105         while (vbits > 0) {
106             int c = bitbuf << (32 - vbits) >>> 24;
107             vbits -= 8;
108             out.write(c);
109         }
110         vbits = 0;
111         bitbuf = 0;
112         out.flush();
113     }
114
115     /**
116      * Writes b.length bytes to output stream.
117      * Only first getBitsToWrite() from every byte are written to stream.
118      * @param b the data to be written.
119      * @throws IOException if an I/O error occurs.
120      */

121     public void write(byte b[]) throws IOException JavaDoc {
122         write(b, 0, b.length);
123     }
124
125     /**
126      * Writes len bytes from byte array starting at given offset to output stream.
127      * Only first getBitsToWrite() from every byte are written to stream.
128      * @param b the data to be written.
129      * @param off the start offset in the data.
130      * @param len the number of bytes to write.
131      * @throws IOException if I/O error occurs
132      */

133     public void write(byte b[], int off, int len) throws IOException JavaDoc {
134         for (int i = 0; i < len; i++) {
135             write(b[off + i]);
136         }
137     }
138 }
139
Popular Tags