bufferedinputstream乱码是因为bufferedinputstream读取的是字节byte,那么如果读取的数据比较长,并且没有一次性读完,就会出现乱码,其解决乱码问题的办法就是用bufferedreader来读取,其读取代码如“bufferedreader reader = new bufferedreader (...)”。
本教程操作环境:windows10系统、java8.0、dell g3电脑。
bufferedinputstream乱码怎么办?
bufferedinputstream和bufferedoutputstream用法解决乱码
昨晚写了一个把所有的简体汉字转换成繁体并且取出拼音的程序,在io流操作中遇到了中文乱码问题。
下面是我写的程序
package com.java.utils.charactor; import java.io.bufferedinputstream;import java.io.bufferedreader;import java.io.datainputstream;import java.io.file;import java.io.fileinputstream;import java.io.inputstreamreader;import java.sql.connection;import java.sql.drivermanager;import java.sql.statement; /** * 简繁体转换 * * @author pengjianbo <pengjianbosoft@gmail.com> * $id$ */public class simtradconvert { public simtradconvert() throws exception { file simplfile = new file( "d:\\android\\javautils\\src\\com\\java\\utils\\charactor\\simplified.txt"); fileinputstream simplfis = new fileinputstream(simplfile); bufferedinputstream simplbis = new bufferedinputstream(simplfis); bufferedreader simplbr = new bufferedreader(new inputstreamreader(simplbis)); stringbuffer simplsb = new stringbuffer(); byte[] simplb = new byte[1024]; while ((simplbis.read(simplb)) != -1) { simplsb.append(new string(simplb)); } simplfis.close(); simplbis.close(); file tradfile = new file( "d:\\android\\javautils\\src\\com\\java\\utils\\charactor\\traditional.txt"); fileinputstream tradfis = new fileinputstream(tradfile); bufferedinputstream tradbis = new bufferedinputstream(tradfis); stringbuffer tradsb = new stringbuffer(); byte[] tradb = new byte[1024]; while ((tradbis.read(tradb)) != -1) { tradsb.append(new string(tradb)); } tradbis.close(); tradfis.close(); system.out.println(simplsb.tostring()); /*cngetpinyin pinyin = new cngetpinyin(); //连接sqlite的jdbc class.forname("org.sqlite.jdbc"); connection conn = drivermanager.getconnection("jdbc:sqlite:pai.db"); statement stat = conn.createstatement(); for(int i = 0; i < simplsb.length() -1; i++ ) { stat.executeupdate( "insert into cnlang(pinyin,simp,trad) values('" + pinyin.getpinyin(simplsb.substring(i, i + 1)) + "','" + simplsb.substring(i, i + 1) + "','" + tradsb.substring(i, i + 1) + "')"); system.out.println("正在添加:" + simplsb.substring(i, i + 1) + "-->" + tradsb.substring(i, i + 1)); if( i > simplsb.length() -1 ) { stat.close(); conn.close(); } }*/ } public static void main(string[] args) throws exception { new simtradconvert(); } }
在我的这个程序中,用bufferedinputstream,而且用了read(byte[]),就出了读取出来现在部分的中文乱码,我想是我这个byte[] tradb = new byte[1024];缓冲大小设置的问题,试图去更改byte[]的在小,结果出现乱码的地方和原先的不一样了。也就说明了,在缓冲的末尾的时候出了问题,末尾的那个字节容纳不了一个汉字,所以出现的乱码。我想如果用read()去读取的话应该不会出现这个问题的(没试过)。像我的这种读取大量的中文数据我想我宁愿用read去读,大不了就开一个线程嘛。
下面是我看到网上别人写的博客:后来在网上找一下资料,转载如下:
bufferedinputstream和bufferedoutputstream是过滤流,需要使用已存在的节点来构造,即必须先有inputstream或outputstream,相对直接读写,这两个流提供带缓存的读写,提高了系统读写效率性能.bufferedinputstream读取的是字节byte,因为一个汉字占两个字节,而当中英文混合的时候,有的字符占一个字节,有的字符占两个字节,所以如果直接读字节,而数据比较长,没有一次读完的时候,很可能刚好读到一个汉字的前一个字节,这样,这个中文就成了乱码,后面的数据因为没有字节对齐,也都成了乱码.所以我们需要用bufferedreader来读取,它读到的是字符,所以不会读到半个字符的情况,不会出现乱码.
package com.pocketdigi; import java.io.bufferedinputstream;import java.io.bufferedoutputstream;import java.io.bufferedreader;import java.io.file;import java.io.fileinputstream;import java.io.fileoutputstream;import java.io.ioexception;import java.io.inputstreamreader; public class main { public static void main(string[] args) throws ioexception { file f = new file("d:/a.txt"); fileoutputstream fos = new fileoutputstream(f); // 构建fileoutputstream对象,文件不存在会自动新建 bufferedoutputstream bos = new bufferedoutputstream(fos); bos.write("1我是中文".getbytes()); bos.close(); // 关闭输出流,写入数据,如果下面还要写用flush(); // 因为是bufferoutputstream链接到fileoutputstream,只需关闭尾端的流 // 所以不需要关闭fileoutputstream; fileinputstream fis = new fileinputstream(f); bufferedinputstream bis = new bufferedinputstream(fis); bufferedreader reader = new bufferedreader (new inputstreamreader(bis)); //之所以用bufferedreader,而不是直接用bufferedinputstream读取,是因为bufferedinputstream是inputstream的间接子类, //inputstream的read方法读取的是一个byte,而一个中文占两个byte,所以可能会出现读到半个汉字的情况,就是乱码. //bufferedreader继承自reader,该类的read方法读取的是char,所以无论如何不会出现读个半个汉字的. stringbuffer result = new stringbuffer(); while (reader.ready()) { result.append((char)reader.read()); } system.out.println(result.tostring()); reader.close(); } }
推荐学习:《java视频教程》
以上就是bufferedinputstream乱码怎么办的详细内容。
