java UTF-8 和 UTF-8 without BOM工具处理类

package org.shefron.fc.utfwithbom;

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

public class UTFFileHandler {

	/**
	 *
	 * @param file the filePath
	 * @return the FileInputStream
	 * @throws Exception
	 */
	public static InputStream getInputStream(String file) throws Exception{
		FileInputStream fis = null;
		try{
			fis = new FileInputStream(file);
		}catch(Exception e){
			System.out.println(e.getMessage());
			throw new Exception("IO Stream Error!");
		}
		return fis;

	}

	/**
	 *
	 * @param file the filePath
	 * @param enc  the default encoding
	 * @return the UTFFileHandler.UnicodeInputStream
	 * @throws Exception
	 */
	public static InputStream getInputStreamWithoutBom(String file,String enc) throws Exception{

		UnicodeInputStream stream = null;
		try{
			FileInputStream fis = new FileInputStream(file);
			stream = new UnicodeInputStream(fis,null);
			System.out.println("encoding:"+stream.getEncoding() );
		}catch(Exception e){
			System.out.println(e.getMessage());
			throw new Exception("IO Stream Error!");
		}
		return stream;

	}

	/**
	 * This inputstream will recognize unicode BOM marks and will skip bytes if
	 * getEncoding() method is called before any of the read(...) methods.
	 *
	 * Usage pattern: String enc = "ISO-8859-1"; // or NULL to use systemdefault
	 * FileInputStream fis = new FileInputStream(file); UnicodeInputStream uin = new
	 * UnicodeInputStream(fis, enc); enc = uin.getEncoding(); // check and skip
	 * possible BOM bytes InputStreamReader in; if (enc == null) in = new
	 * InputStreamReader(uin); else in = new InputStreamReader(uin, enc);
	 */
	public static class UnicodeInputStream extends InputStream {
	    PushbackInputStream internalIn;
	    boolean isInited = false;
	    String defaultEnc;
	    String encoding;

	    private static final int BOM_SIZE = 4;

	    public UnicodeInputStream(InputStream in, String defaultEnc) {
	        internalIn = new PushbackInputStream(in, BOM_SIZE);
	        this.defaultEnc = defaultEnc;
	    }

	    public String getDefaultEncoding() {
	        return defaultEnc;
	    }

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

	    /**
	     * 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() throws IOException {
	        if (isInited)
	            return;

	        byte bom[] = new byte[BOM_SIZE];
	        int n, 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);

	        isInited = true;
	    }

	    public void close() throws IOException {
	        // init();
//	        isInited = true;
	        internalIn.close();
	    }

	    public int read() throws IOException {
	        // init();
//	        isInited = true;
	        return internalIn.read();
	    }
	}

}
时间: 2024-11-07 14:15:15

java UTF-8 和 UTF-8 without BOM工具处理类的相关文章

Java中带包(创建及引用)的类的编译与调试

Java中带包(创建及引用)的类的编译与调试 java源程序的编译大家都知道,也就是cmd中到源文件所在目录下javac **.java即可,当程序中有包声明还能简简单单的直接javac **.java吗?答案当然是no,下面举个简单的例子证明一下直接javac **.java会怎么样. 如下:F:\javaweb2班\20160531目录下有A.java文件,注意源文件中有包声明 package mypack; public class A { String name; int age; pu

Java 计算数学表达式(字符串解析求值工具)

Java字符串转换成算术表达式计算并输出结果,通过这个工具可以直接对字符串形式的算术表达式进行运算,并且使用非常简单. 这个工具中包含两个类 Calculator 和 ArithHelper Calculator 代码如下: import java.util.Collections; import java.util.Stack; /** * 算数表达式求值 * 直接调用Calculator的类方法conversion() * 传入算数表达式,将返回一个浮点值结果 * 如果计算过程错误,将返回一

JAVA设计模式-装饰设计模式-继承体系的由来和装饰类的优化

首先看一下我们设计类的过程: 专门用于读取数据的类 MyReader l--MyTextReader:根据不同的功能会不断延伸很多子类 l--MyMeidaReader l--MyDataReader l--.......... 为了提高以上子类的工作效率,需要加入缓冲区技术.所以又会出现下面的类的继承体系. (体系1) MyReader l--MyTextReader:根据不同的功能会不断延伸很多子类 l--MyBufferedTextReader l--MyMeidaReader l--My

Java——(三)Collection之Set集合、HashSet类

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.Set集合 Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加 操作失败,add方法返回false,而新元素不会被加入. Set判断两对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用 equals方法比较返回true,Ser就不会接受这两个对象:反之,只要两个对象用equals方法比较 返回false,SEt就会接受这两个对

java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题

1 /* 2 对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中, 3 并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行 4 */ 5 import static java.lang.System.out; 6 7 public class PersonDemo 8 { 9 public static void main(String[] args) 10 { 11 //*********测试父类与子类之间的循环调用的问

JavApi 以类似 Java API 的形式提供一组 .NET 的工具类

javApi 以类似 Java API 的形式提供一组 .NET 的工具类. 下面是一些示例代码: SampleGZIPOutputStream2File.cs: GZip a file content into other file.?(Example for: FileInputStream, FileOutputStream, GZIPOutputStream) SampleTextFileOutputStream.cs: Write text or binaries to file.?(

用java的swing写了个图片标注工具

功能说明: 1 鼠标单击:选取裁剪区域 2 鼠标双击:选取裁剪区域,并把裁剪区域保存为文件,同时把区域中心点的坐标保存 3 打开图片:从某个文件夹打开图片并显示,同时把该目录的所有图片的路径载进来.这个功能主要是针对这么种情况, 假如处理某个文件夹的图片集,在某一张终止了或者暂停了,下一次要从这种图片开始. 4 保存坐标:把裁剪区域保存为文件,同时把区域中心点的坐标保存 5 打开目录:把该目录的所有图片的路径载进来. 6 下一张:展示下一张图片. 常见用法: 1 "打开目录",这时会将

编译和运行java文件 找不到或无法加载主类

这边提供一个关于程序中含有package关键字,使用"终端"运行程序时出现"找不到或无法加载主类",而使用Eclipse软件可以正常运行程序的可能解决办法. 例如程序名为HelloWorldTest.java,程序中含有package helloWorld语句,而该包位于javatest目录下,即javatest/helloWorld/HelloWorldTest.java. 应该在java文件所在的目录运行javac指令,即在helloWorld目录中运行java

记一次解决cmd中执行java提示"找不到或无法加载主类"的问题

今天遇到一个问题:在cmd命令行中,用javac编译java文件可以成功,但是用java执行却提示"找不到或无法加载主类".现将该问题的原因以及解决办法记录一下. 先理解一下系统变量path和classpath的作用. path:可执行命令的搜索路径,在该路径下搜索可以运行的程序或批处理文件. 命令行中输入一个命令,则会在path配置的目录中查找该命令,如果存在则调用该程序运行,如果不存在则提示" 'XXX' 不是内部或外部命令,也不是可运行的程序或批处理文件."