InputStream 读取中文乱码 扩展
2019-12-16 18:11
3187 查看
对于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; } } }
相关文章推荐
- java:InputStream读取文件时出现中文乱码问题
- phpexcel 读取中文gbk数据的csv在linux服务器下乱码的解决方法.
- java.util.Properties读取中文内容的配置文件,发生中文乱码的现象有解决方案
- request.getInputStream中文乱码解决方案
- 解决中文随机读取的乱码问题
- RandomAccessFile readLine 方法读取中文乱码
- Properties中文键值读取乱码解决随记
- PHP读取TXT中文乱码的解决方法
- Python读取.xml文件(<?xml version="1.0" encoding="UTF-16"?>)中文乱码问题解决
- 文件读取中文乱码
- InputStream读取中文字符并由ByteArrayOutputStream写入
- RichTextBox扩展控件的中文乱码解决方案
- jmeter之http请求用csv读取中文乱码
- 【转载】C#中StreamReader读取中文文本出现乱码的解决方法
- flex 读取外部txt文件时候出现中文乱码现象
- Android 读取TXT 文件中文乱码 解决方案
- 关于Spring boot中读取属性配置文件出现中文乱码的问题的解决
- 使用java.nio及其子包中的类SocketChanel完成如下功能:读取www.baidu.com等网页的内容,打印到控制台,避免中文乱码问题。
- 【Java IO知识】读取中文乱码问题解决
- 解决PHP写入、读取MYSQL数据库数据中文乱码问题