Package sos.util

Source Code of sos.util.SOSUnicodeInputStream

/********************************************************* begin of preamble
**
** Copyright (C) 2003-2010 Software- und Organisations-Service GmbH.
** All rights reserved.
**
** This file may be used under the terms of either the
**
**   GNU General Public License version 2.0 (GPL)
**
**   as published by the Free Software Foundation
**   http://www.gnu.org/licenses/gpl-2.0.txt and appearing in the file
**   LICENSE.GPL included in the packaging of this file.
**
** or the
** 
**   Agreement for Purchase and Licensing
**
**   as offered by Software- und Organisations-Service GmbH
**   in the respective terms of supply that ship with this file.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
** IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
** BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
** POSSIBILITY OF SUCH DAMAGE.
********************************************************** end of preamble*/
/*
* SOSUnicodeInputStream.java
* Created on 04.09.2008
*
*/
package sos.util;

import java.io.IOException;
import java.io.InputStream;
import java.io.PushbackInputStream;

public class SOSUnicodeInputStream extends InputStream {

  private PushbackInputStream inStr;
  private boolean initialized = false;
  private String defaultEncoding;
  private String encoding;

  private static final int BOM_SIZE = 4;

  SOSUnicodeInputStream(InputStream in, String defaultEnc) {
    inStr = new PushbackInputStream(in, BOM_SIZE);
    this.defaultEncoding = defaultEnc;
  }

  /**
   * check and skip BOM Bytes
   */
  protected void init() throws IOException {
    if (initialized)
      return;

    byte bom[] = new byte[BOM_SIZE];
    int n, unread;
    n = inStr.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 {
      // No BOM mark found
      encoding = defaultEncoding;
      unread = n;
    }

    if (unread > 0)
      inStr.unread(bom, (n - unread), unread);

    initialized = true;
  }

  public String getEncoding() {
    if (!initialized) {
      try {
        init();
      } catch (IOException ex) {
        IllegalStateException ise = new IllegalStateException(
            "Init method failed.");
        ise.initCause(ise);
        throw ise;
      }
    }
    return encoding;
  }

  public void close() throws IOException {
    initialized = true;
    inStr.close();
  }

  public int read() throws IOException {
    initialized = true;
    return inStr.read();
  }

}
TOP

Related Classes of sos.util.SOSUnicodeInputStream

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.