packagecom.montnets.email.common;/***@author: chenlinyan
*@version: 2.0
* @date : 2019/8/15 11:00*/
import java.io.*;/*** Generic unicode textreader, which will use BOM mark to identify the encoding
* to be used. If BOM is not found then use a given default or system encoding.*/
public class UnicodeReader extendsReader {
PushbackInputStream internalIn;
InputStreamReader internalIn2= null;
String defaultEnc;private static final int BOM_SIZE = 4;/***
*@paramin
* inputstream to be read
*@paramdefaultEnc
* default encoding if stream does not have BOM marker. Give NULL
* to use system-level default.*/
publicUnicodeReader(InputStream in, String defaultEnc) {
internalIn= newPushbackInputStream(in, BOM_SIZE);this.defaultEnc =defaultEnc;
}publicString getDefaultEncoding() {returndefaultEnc;
}/*** Get stream encoding or NULL if stream is uninitialized. Call init() or
* read() method to initialize it.*/
publicString getEncoding() {if (internalIn2 == null)return null;returninternalIn2.getEncoding();
}/*** Read-ahead four bytes and check for BOM marks. Extra bytes are unread
* back to the stream, only BOM bytes are skipped.*/
protected void init() throwsIOException {if (internalIn2 != null)return;
String encoding;byte bom[] = new byte[BOM_SIZE];intn, unread;
n= internalIn.read(bom, 0, bom.length);if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00)&& (bom[2] == (byte) 0xFE) && (bom[3] == (byte) 0xFF)) {
encoding= "UTF-32BE";
unread= n - 4;
}else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)&& (bom[2] == (byte) 0x00) && (bom[3] == (byte) 0x00)) {
encoding= "UTF-32LE";
unread= n - 4;
}else if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB)&& (bom[2] == (byte) 0xBF)) {
encoding= "UTF-8";
unread= n - 3;
}else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) {
encoding= "UTF-16BE";
unread= n - 2;
}else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) {
encoding= "UTF-16LE";
unread= n - 2;
}else{//Unicode BOM mark not found, unread all bytes
encoding =defaultEnc;
unread=n;
}//System.out.println("read=" + n + ", unread=" + unread);
if (unread > 0)
internalIn.unread(bom, (n-unread), unread);//Use given encoding
if (encoding == null) {
internalIn2= newInputStreamReader(internalIn);
}else{
internalIn2= newInputStreamReader(internalIn, encoding);
}
}public void close() throwsIOException {
init();
internalIn2.close();
}public int read(char[] cbuf, int off, int len) throwsIOException {
init();returninternalIn2.read(cbuf, off, len);
}
}