对于InputStream读取中文乱码,下面这段话给出了很好的解释,以及后续编码上的扩展。

BufferedInputStream和BufferedOutputStream是过滤流,需要使用已存在的节点来构造。
即必须先有InputStream或OutputStream,相对直接读写,这两个流提供带缓存的读写,提高了系统读写效率性能。
BufferedInputStream读取的是字节byte,因为一个汉字占两个字节,而当中英文混合的时候,有的字符占一个字节,有的字符占两个字节。
所以如果直接读字节,而数据比较长,没有一次读完的时候,很可能刚好读到一个汉字的前一个字节,这样,这个中文就成了乱码,后面的数据因为没有字节对齐,也都成了乱码。
所以我们需要用BufferedReader来读取,它读到的是字符,所以不会读到半个字符的情况,不会出现乱码。
 package com.read;

 import java.io.*;

 /**
*千字文.txt 在 classpath 用来测试
*/
public class Main { public static void main(String[] args) { File file = new File("千字文.txt"); Object obj = loadFileContent(file);
if (obj!=null){
System.out.println(obj.toString());
}
} /**
* 此方法 读到的是字符,所以不会读到半个字符的情况,不会出现乱码.
* @param file
* @return
*/
public static Object readFile(File file) {
StringBuilder buffer = new StringBuilder();
try {
if (!file.exists()) {
return null;
} InputStream inputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(bufferedInputStream)); while (bufferedReader.ready()) {
buffer.append((char) bufferedReader.read());
} bufferedReader.close();
bufferedInputStream.close();
inputStream.close(); return buffer.toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
} /**
* byte字节流读取文件时 一个汉字占2个字节
* 可能只能读到半个 时长度没有一次读完时 字符无法对齐
* 出现乱码 可能会是以上原因
* @param file
* @return
*/
public static Object loadFileContent(File file) {
StringBuffer buffer = new StringBuffer();
try { if (!file.exists()) {
return null;
} InputStream inputStream = new FileInputStream(file);
byte[] bytes = new byte[1024];
int length; while ((length = inputStream.read(bytes)) != -1) {
buffer.append(new String(bytes, 0, length));
} inputStream.close(); return buffer.toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}

InputStream 读取中文乱码 扩展的更多相关文章

  1. File.ReadAllText 读取中文乱码问题

    原文:File.ReadAllText 读取中文乱码问题 用 File.ReadAllText(filepath)   去读取中文txt文件会遇到乱码问题,我自己测试了一下,ANSI编码的txt才会出 ...

  2. 关于java.util.Properties读取中文乱码的正确解决方案(不要再用native2ascii.exe了)

    从Spring框架流行后,几乎根本不用自己写解析配置文件的代码了,但近日一个基础项目(实在是太基础,不能用硕大繁琐的Spring), 碰到了用java.util.Properties读取中文内容(UT ...

  3. 解决使用Properties读取中文乱码问题

    web服务返回的是多行以key和value对应的键值对,且编码为utf-8.我的项目使用的编码也是utf-8,但是我用Properties读取中文的时候,打印出来的总是乱码. 后来网上查了一下,得到如 ...

  4. Delphi NativeXml读取中文乱码问题解决

    NativeXml默认的字符类型为Utf8String,有时在读取中文时还是会出现乱码问题,在329版本中提供一种类型转换函数sdUtf8ToWide(),我们可以这样sdUtf8ToWide(AXm ...

  5. 如何处理Cookie存储和读取中文乱码问题

    存储Cookie for(String str:books){ str=new String(str.getBytes("ISO-8859-1"),"utf-8" ...

  6. jmeter之http请求用csv读取中文乱码

    jmeter3.2版本中CSV Data Set Config从本地读取静态文件的时候,遇到中文乱码的解决方式如下: CSV Data Set Config设置 http请求数据显示乱码 把txt文档 ...

  7. sqlite读取中文乱码(C#)

    C#读取一些C++创建的sqlite数据库时乱码,  C++保存DB是用GB2312编码的, C#调用的官方的system.data.sqlite是用的UTF-8编码的, 在读取时会乱码, 用一个GB ...

  8. boost.property_tree读取中文乱码问题正确的解决方式

    开发项目的时候在使用boost,在宽字符下遇到中文乱码问题 上网上看大家都是先转成utf8在进行解析的,例如: http://blog.csdn.net/hu_jiangan/article/deta ...

  9. java读取中文乱码解决方法

    Java读取文本文件(例如csv文件.txt文件等),遇到中文就变成乱码.读取代码如下: List<String> lines=new ArrayList<String>(); ...

随机推荐

  1. QKD 一些术语的含义

    密钥率:每个信道使用的比特数. 系统开销:不能用来提取最终密钥的信号百分比. SNU:散粒噪声单元 RNG:随机数发生器 QRNG:量子随机数发生器 TRNG:真正的随机数生成器 PRNG:伪随机数发 ...

  2. 这份最新Python面试精选问题你会几道?

    相信很多小伙伴学python以后都想进大厂,但是进大厂前你得了解些大厂面试题,可以在面试前复习下,以下是精选的5道python面试题: 第一. Python 的特点和优点是什么? Python 可以作 ...

  3. Python日志模块logging简介

    日志处理是项目的必备功能,配置合理的日志,可以帮助我们了解系统的运行状况.定位位置,辅助数据分析技术,还可以挖掘出一些额外的系统信息. 本文介绍Python内置的日志处理模块logging的常见用法. ...

  4. pat 1069 The Black Hole of Numbers(20 分)

    1069 The Black Hole of Numbers(20 分) For any 4-digit integer except the ones with all the digits bei ...

  5. nyoj 47-过河问题 (贪心)

    47-过河问题 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:2 submit:5 题目描述: 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的 ...

  6. Tsx写一个通用的button组件

    一年又要到年底了,vue3.0都已经出来了,我们也不能一直还停留在过去的js中,是时候学习并且在项目中使用一下Ts了. 如果说jsx是基于js的话,那么tsx就是基于typescript的 废话也不多 ...

  7. API网关在API安全性中的作用

    从单一应用程序切换到微服务时,客户端的行为不能与客户端具有该应用程序的一个入口点的行为相同.简单来说就是微服务上的某一部分功能与单独实现该应用程序时存在不同. 目前在使用微服务时,客户端必须处理微服务 ...

  8. nodejs入门之模块

    nodejs模块语法与开闭原则 nodejs模块的底层实现 一.nodejs模块语法与开闭原则 关于nodejs模块我在之前的两篇博客中都有涉及,但都没有对nodejs模块的底层做做任何探讨,但是为了 ...

  9. python获取随机验证码或者下发激活码

    http://stackoverflow.com/questions/2823316/generate-a-random-letter-in-python >>> import ra ...

  10. 你必须知道的容器日志 (2) 开源日志管理方案 ELK

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.上一篇<你必须知道的容器日志(1)>中介绍了Docker自带的log ...