KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > batik > util > io > UTF16Decoder


1 /*
2
3    Copyright 2002-2003 The Apache Software Foundation
4
5    Licensed under the Apache License, Version 2.0 (the "License");
6    you may not use this file except in compliance with the License.
7    You may obtain a copy of the License at
8
9        http://www.apache.org/licenses/LICENSE-2.0
10
11    Unless required by applicable law or agreed to in writing, software
12    distributed under the License is distributed on an "AS IS" BASIS,
13    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14    See the License for the specific language governing permissions and
15    limitations under the License.
16
17  */

18 package org.apache.batik.util.io;
19
20 import java.io.IOException JavaDoc;
21 import java.io.InputStream JavaDoc;
22
23 /**
24  * This class represents an object which decodes UTF-16 characters from
25  * a stream of bytes.
26  *
27  * @author <a HREF="mailto:stephane@hillion.org">Stephane Hillion</a>
28  * @version $Id: UTF16Decoder.java,v 1.4 2004/08/18 07:15:58 vhardy Exp $
29  */

30 public class UTF16Decoder extends AbstractCharDecoder {
31
32     /**
33      * Whether the stream's byte-order is big-endian.
34      */

35     protected boolean bigEndian;
36     
37     /**
38      * Creates a new UTF16Decoder.
39      * It is assumed that the byte-order mark is present.
40      * @param is The stream to decode.
41      */

42     public UTF16Decoder(InputStream JavaDoc is) throws IOException JavaDoc {
43         super(is);
44         // Byte-order detection.
45
int b1 = is.read();
46         if (b1 == -1) {
47             endOfStreamError("UTF-16");
48         }
49         int b2 = is.read();
50         if (b2 == -1) {
51             endOfStreamError("UTF-16");
52         }
53         int m = (((b1 & 0xff) << 8) | (b2 & 0xff));
54         switch (m) {
55         case 0xfeff:
56             bigEndian = true;
57             break;
58         case 0xfffe:
59             break;
60         default:
61             charError("UTF-16");
62         }
63     }
64
65     /**
66      * Creates a new UTF16Decoder.
67      * @param is The stream to decode.
68      * @param be Whether or not the given stream's byte-order is
69      * big-endian.
70      */

71     public UTF16Decoder(InputStream JavaDoc is, boolean be) {
72         super(is);
73         bigEndian = be;
74     }
75
76     /**
77      * Reads the next character.
78      * @return a character or END_OF_STREAM.
79      */

80     public int readChar() throws IOException JavaDoc {
81         if (position == count) {
82             fillBuffer();
83         }
84         if (count == -1) {
85             return END_OF_STREAM;
86         }
87         byte b1 = buffer[position++];
88         if (position == count) {
89             fillBuffer();
90         }
91         if (count == -1) {
92             endOfStreamError("UTF-16");
93         }
94         byte b2 = buffer[position++];
95         int c = (bigEndian)
96             ? (((b1 & 0xff) << 8) | (b2 & 0xff))
97             : (((b2 & 0xff) << 8) | (b1 & 0xff));
98         if (c == 0xfffe) {
99             charError("UTF-16");
100         }
101         return c;
102     }
103 }
104
Popular Tags