首先,如果你明确的知道使用的编码,那么你可以在读取完毕生成字符串的时候直接指定编码。

例如:

FileInputStream in = new FileInputStream("aaa.txt");

byte[] data = new byte[1024 * 4];

StringBuilder sb = new StringBuilder();

while(in.read(data) > 0) {

sb.append(new String(data,"utf8"); // 指定编码格式,避免乱码}

System.out.println(sb.toString());

这里FileInputStream就是很标准的字节流了,只需要在最终形成字符串的时候指定正确的编码,那么就可以避免乱码。

或者利用新的NIO的API读取:

Path path = Paths.get("D:/aaa.txt");

byte[] data = Files.readAllBytes(path);

String result = new String(data,"utf8"); // 指定编码,可以避免乱码。System.out.println(result);

那么,当我们不确定他的编码的时候,该怎么办呢,这就需要使用类库去猜解他的编码,我用的是这个:cpdetector,他的maven依赖如下:

net.sourceforge.cpdetector

cpdetector

1.0.7

具体用法是这样的:

/*** 初始化一个编码判别器,用于判断文件编码。*/

public static CodepageDetectorProxy getCodePageDetector() {

CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();

// 这个用于处理文本文件或者有明确编码的文件 detector.add(new ParsingDetector(false));

// 用于检测Unicode的编码 detector.add(UnicodeDetector.getInstance());

// 用于检测各类型的编码 detector.add(JChardetFacade.getInstance());

// 用于检测ASCII类型编码 detector.add(ASCIIDetector.getInstance());

return detector;

}

然后通过这种做法获取具体的编码:

/*** 获取输入流的编码格式,但是似乎这种方法有点问题。*/

public static Charset getCharset(InputStream in) {

CodepageDetectorProxy detectorProxy = getCodePageDetector();

try(BufferedInputStream bufferedInputStream = new BufferedInputStream(in)) {

return detectorProxy.detectCodepage(bufferedInputStream, 128);

} catch (Exception e) {

e.printStackTrace();

return Charset.defaultCharset();

}

}

/*** 获取文件的编码格式,一般用到的就是他了。*/

public static Charset getCharset(File file) {

CodepageDetectorProxy detectorProxy = getCodePageDetector();

try {

return detectorProxy.detectCodepage(file.toURI().toURL());

} catch (Exception e) {

return Charset.defaultCharset();

}

}

那么经过上面两个步骤,我们就能够得到一个charset对象,用他创建string,如果猜测的编码是正确的,就不会出现乱码,当然猜测代码比较耗费时间的,这个在使用的时候要注意一下。

说到乱码,我们得知道输入流是怎么处理字符的。

InputStream是一个读取字节的东西,因为无论是什么文本数据,存到系统的时候都是二进制的字节,为了能正确显示字符,需要有一个东西把字符表示为二进制字节,这个东西就是编码表。

不同的码表的字符和他对应的二进制字节的对应关系是不一致的,那么如果一个字符通过编码格式A编码,但是读取的时候通过编码格式B读取,那么就有一定几率出现乱码,为什么是有一定几率呢,是因为字符集有的是可以相互兼容的,尤其是英文字符部分,不兼容的部分就会出现乱码。

那么java是怎么处理字符流的呢?

Java的字符流从本质上来说,是字节流的衍生,他通过StreamDecoder和StreamEncoder进行处理,StreamEncoder的作用是将字符按照某种编码输出为字节,StreamDecoder作用是将某些字节按照某个编码方式解码成字符,你可以自己指定使用的编码类型,当然你不指定,他也会有一个默认的编码类型,而一旦你的文件编码和默认编码不一致,而你又没有指定字符集,那么出现乱码几乎是必然的。

因此我不赞同你认为字符流能够解决乱码问题,在这个问题上没有一劳永逸的办法,如果阁下知道更合理的解决方案欢迎补充,或者指出回答中不正确的部分。

java 字节流乱码_java用字节流读取中文乱码怎么解决?相关推荐

  1. java生成html乱码_java向html输出中文乱码解决方法

    java向html输出中文乱码根本原因就是编码不一致的问题,所以解决方式就是设置编码的方式. 其中,还分为字节流和字符流的解决方式 字节流:response.setHeader("Conte ...

  2. Java如何校验中文乱码_java如何判断是否中文乱码

    中文乱码在项目中是经常会遇到的情况.当我们通过设置request和response字符集,但是还是出现中文乱码的时候,今天给介绍一种通过java方法实现判断string是否为乱码的方法./** * 判 ...

  3. java url路径中文乱码_Java Url请求方式中文乱码问题解决办法

    jsp中post方式请求一般不会乱码,如果乱码加上这句: 解决办法一 request.setCharacterEncoding("utf-8"); 而get方式请求,若url含非西 ...

  4. java randomaccessfile 乱码_Java 8 RandomAccessFile 读取 UTF-8 乱码

    问题结论 为什么 RandomAccessFile 的 readLine() 读 UTF-8 文件是乱码? RandomAccessFile 的函数 readLine() 使用 ISO-8859-1 ...

  5. java解压中文乱码_java解压文件中文乱码怎么处理

    上次利用java自动的java.util.zip.ZipEntry和??java.util.zip.ZipFile来解压zip文件,今天发现程序在读取解压文件时居然报了空指针异常,debug程序后发现 ...

  6. mysql java中文乱码_java连接mysql添加中文乱码_MySQL

    bitsCN.com java添加中文数据到mysql中, 包含中文就乱码 最初是想应该是由于字符编码不一致,所以查看数据库的属性跟表的属性 查看表的字符集也是utf8,不是的改成自己想要设置的,我这 ...

  7. java乱码转中文乱码_java字节数组转换中文乱码,请求帮助

    从第三方数据库中获取的内容为字节数组,尝试多种方式转换成中文,不过都显示乱码.下面是数据库中返回的字节数组,自己做测试所以直接在测试类里面写出来了.小弟对这一块东西不太熟悉,请... 从第三方数据库中 ...

  8. java get提交中文乱码_java get方法提交中文乱码问题

    tomcat 下的conf/server.xml connectionTimeout="20000" redirectPort="8443"/> 换成 c ...

  9. java连接mysql数据库时出现乱码_java连接mysql数据库中文乱码问题

    完整安装cocoaPods cocoaPods是一款xcode项目管理第三方库的工具 *ruby源码镜像下载:https://ruby.taobao.org/mirrors/ruby/*升级gem的版 ...

最新文章

  1. input自适应_一种Dynamic ReLU:自适应参数化ReLU(调参记录26)Cifar10~95.92%
  2. cover letter 转
  3. 2021HDU多校6 - 7028 Decomposition(构造)
  4. django项目时间与Ubuntu时间不一致
  5. 在矩池云中保存Conda环境
  6. CCF201609-1 最大波动(100分)
  7. .Net Compact Framework 基础篇(10)--多语言程序的定制
  8. 软件测试之测试的分类
  9. 华为数通考试正式改版,改版前后有什么区别?
  10. 数据库中多表连接的左连接、右连接、内连接、全连接的使用场景
  11. css的鼠标手势大全
  12. 凝胶渗透色谱的基本概念(一)
  13. c语言命令行贪吃蛇,C语言实现贪吃蛇游戏(命令行)
  14. 大数据舆情分析:全方位解读《战狼2》
  15. 弗洛伊德求最小简单环
  16. 岚山区教师招聘计算机试题,2019年山东省日照市岚山区中小学语文教师招聘/编制考试历年真题试卷及答案解析...
  17. [MS Project]Project软件入门两天之旅
  18. 64位Slitaz Linux下Glibc 2.20编译式更新安装成功
  19. python常用模块总结(嵌入式日志分析)
  20. 音频降噪算法 java_基于RNN的音频降噪算法

热门文章

  1. 单选框,下拉框,复选框 的回显
  2. OSChina 周三乱弹 ——grath最近睡了一主播
  3. STM32F411的HSI和HSE启动方式切换及仿真
  4. PHP案例:每一个账号登陆后的操作是隔离的(使用token进行登录)
  5. 2022还在为怎样去提升自己Android技术而发愁吗?享学课堂是个不错的选择
  6. 软件设计师2018下半年上午真题解析
  7. mysql holdlock_mysql事务隔离界别与锁机制
  8. c语言编程转化为vba编程,PPT VBA编程.doc
  9. 发明现代概率的男人:他如何发现“不可能”对人类事务的影响?
  10. 花至毒则不败,人至贱则无敌