Javolution 6.0.0 java
UTF8ByteBufferWriter.java
Go to the documentation of this file.
1 /*
2  * Javolution - Java(TM) Solution for Real-Time and Embedded Systems
3  * Copyright (C) 2012 - Javolution (http://javolution.org/)
4  * All rights reserved.
5  *
6  * Permission to use, copy, modify, and distribute this software is
7  * freely granted, provided that this notice is preserved.
8  */
9 package javolution.io;
10 
11 import java.io.CharConversionException;
12 import java.io.IOException;
13 import java.io.Writer;
14 import java.nio.ByteBuffer;
15 
37 public final class UTF8ByteBufferWriter extends Writer {
38 
42  private ByteBuffer _byteBuffer;
43 
48 
57  public UTF8ByteBufferWriter setOutput(ByteBuffer byteBuffer) {
58  if (_byteBuffer != null)
59  throw new IllegalStateException("Writer not closed or reset");
60  _byteBuffer = byteBuffer;
61  return this;
62  }
63 
72  public void write(char c) throws IOException {
73  if ((c < 0xd800) || (c > 0xdfff)) {
74  write((int) c);
75  } else if (c < 0xdc00) { // High surrogate.
76  _highSurrogate = c;
77  } else { // Low surrogate.
78  int code = ((_highSurrogate - 0xd800) << 10) + (c - 0xdc00)
79  + 0x10000;
80  write(code);
81  }
82  }
83 
84  private char _highSurrogate;
85 
92  public void write(int code) throws IOException {
93  if ((code & 0xffffff80) == 0) {
94  _byteBuffer.put((byte) code);
95  } else { // Writes more than one byte.
96  write2(code);
97  }
98  }
99 
100  private void write2(int c) throws IOException {
101  if ((c & 0xfffff800) == 0) { // 2 bytes.
102  _byteBuffer.put((byte) (0xc0 | (c >> 6)));
103  _byteBuffer.put((byte) (0x80 | (c & 0x3f)));
104  } else if ((c & 0xffff0000) == 0) { // 3 bytes.
105  _byteBuffer.put((byte) (0xe0 | (c >> 12)));
106  _byteBuffer.put((byte) (0x80 | ((c >> 6) & 0x3f)));
107  _byteBuffer.put((byte) (0x80 | (c & 0x3f)));
108  } else if ((c & 0xff200000) == 0) { // 4 bytes.
109  _byteBuffer.put((byte) (0xf0 | (c >> 18)));
110  _byteBuffer.put((byte) (0x80 | ((c >> 12) & 0x3f)));
111  _byteBuffer.put((byte) (0x80 | ((c >> 6) & 0x3f)));
112  _byteBuffer.put((byte) (0x80 | (c & 0x3f)));
113  } else if ((c & 0xf4000000) == 0) { // 5 bytes.
114  _byteBuffer.put((byte) (0xf8 | (c >> 24)));
115  _byteBuffer.put((byte) (0x80 | ((c >> 18) & 0x3f)));
116  _byteBuffer.put((byte) (0x80 | ((c >> 12) & 0x3f)));
117  _byteBuffer.put((byte) (0x80 | ((c >> 6) & 0x3f)));
118  _byteBuffer.put((byte) (0x80 | (c & 0x3f)));
119  } else if ((c & 0x80000000) == 0) { // 6 bytes.
120  _byteBuffer.put((byte) (0xfc | (c >> 30)));
121  _byteBuffer.put((byte) (0x80 | ((c >> 24) & 0x3f)));
122  _byteBuffer.put((byte) (0x80 | ((c >> 18) & 0x3f)));
123  _byteBuffer.put((byte) (0x80 | ((c >> 12) & 0x3F)));
124  _byteBuffer.put((byte) (0x80 | ((c >> 6) & 0x3F)));
125  _byteBuffer.put((byte) (0x80 | (c & 0x3F)));
126  } else {
127  throw new CharConversionException("Illegal character U+"
128  + Integer.toHexString(c));
129  }
130  }
131 
140  public void write(char cbuf[], int off, int len) throws IOException {
141  final int off_plus_len = off + len;
142  for (int i = off; i < off_plus_len;) {
143  char c = cbuf[i++];
144  if (c < 0x80) {
145  _byteBuffer.put((byte) c);
146  } else {
147  write(c);
148  }
149  }
150  }
151 
160  public void write(String str, int off, int len) throws IOException {
161  final int off_plus_len = off + len;
162  for (int i = off; i < off_plus_len;) {
163  char c = str.charAt(i++);
164  if (c < 0x80) {
165  _byteBuffer.put((byte) c);
166  } else {
167  write(c);
168  }
169  }
170  }
171 
178  public void write(CharSequence csq) throws IOException {
179  final int length = csq.length();
180  for (int i = 0; i < length;) {
181  char c = csq.charAt(i++);
182  if (c < 0x80) {
183  _byteBuffer.put((byte) c);
184  } else {
185  write(c);
186  }
187  }
188  }
189 
196  public void flush() throws IOException {
197  if (_byteBuffer == null) { throw new IOException("Writer closed"); }
198  }
199 
205  public void close() throws IOException {
206  if (_byteBuffer != null) {
207  reset();
208  }
209  }
210 
211  // Implements Reusable.
212  public void reset() {
213  _byteBuffer = null;
214  _highSurrogate = 0;
215  }
216 
220  public UTF8ByteBufferWriter setByteBuffer(ByteBuffer byteBuffer) {
221  return this.setOutput(byteBuffer);
222  }
223 
224 }
javolution.io.UTF8ByteBufferWriter._byteBuffer
ByteBuffer _byteBuffer
Definition: UTF8ByteBufferWriter.java:42
javolution.io.UTF8ByteBufferWriter._highSurrogate
char _highSurrogate
Definition: UTF8ByteBufferWriter.java:84
javolution.io.UTF8ByteBufferWriter.reset
void reset()
Definition: UTF8ByteBufferWriter.java:212
javolution.io.UTF8ByteBufferWriter.setOutput
UTF8ByteBufferWriter setOutput(ByteBuffer byteBuffer)
Definition: UTF8ByteBufferWriter.java:57
javolution.io.UTF8ByteBufferWriter.write
void write(char c)
Definition: UTF8ByteBufferWriter.java:72
javolution.io.UTF8ByteBufferWriter.write
void write(char cbuf[], int off, int len)
Definition: UTF8ByteBufferWriter.java:140
javolution.io.UTF8ByteBufferWriter.write
void write(int code)
Definition: UTF8ByteBufferWriter.java:92
javolution.io.UTF8ByteBufferWriter.flush
void flush()
Definition: UTF8ByteBufferWriter.java:196
javolution.io.UTF8ByteBufferWriter
Definition: UTF8ByteBufferWriter.java:37
javolution.io.UTF8ByteBufferWriter.close
void close()
Definition: UTF8ByteBufferWriter.java:205
javolution.io.UTF8ByteBufferWriter.write2
void write2(int c)
Definition: UTF8ByteBufferWriter.java:100
javolution.io.UTF8ByteBufferWriter.setByteBuffer
UTF8ByteBufferWriter setByteBuffer(ByteBuffer byteBuffer)
Definition: UTF8ByteBufferWriter.java:220
javolution.io.UTF8ByteBufferWriter.UTF8ByteBufferWriter
UTF8ByteBufferWriter()
Definition: UTF8ByteBufferWriter.java:47
javolution.io.UTF8ByteBufferWriter.write
void write(String str, int off, int len)
Definition: UTF8ByteBufferWriter.java:160
javolution.io.UTF8ByteBufferWriter.write
void write(CharSequence csq)
Definition: UTF8ByteBufferWriter.java:178