java 使用readLine() 乱码的解决

目录
  • 使用readLine() 乱码的解决
    • 本人在公司开发程序遇到了读取 一行乱码
    • 小结一下
  • 调用readLine的乱码问题
    • 下面提供的是readLine字符流指定编码方式的方法

使用readLine() 乱码的解决

本人在公司开发程序遇到了读取 一行乱码

eclipse 默认为utf-8

FileInputStream f4 = new FileInputStream(new File("F:\\bb.txt"));
BufferedReader bufferedReader2 = new BufferedReader(new InputStreamReader(f4));
String readLine = bufferedReader2.readLine(); //会输出乱码

测试文件有两个文本文件分别为,aa.txt (UTF-8编码),bb.txt(GB2312编码)两个文件中的内容都为一个字符 中:

前提知识: utf-8中文占三个字节,GB2312中文占两个字节

测试 代码:

public class EncodeTest {
    @Test
    public void test1() throws Exception{
        FileInputStream f1 = new FileInputStream(new File("F:\\aa.txt"));
        byte[] b1  =  new byte[f1.available()];
        f1.read(b1);
        for(byte b : b1){
            System.out.println(b);
        }
        System.out.println(new String(b1));
        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
        FileInputStream f2 = new FileInputStream(new File("F:\\bb.txt"));
        byte[] b2  =  new byte[f2.available()];
        f2.read(b2);
        for(byte b : b2){
            System.out.println(b);
            byte[] tb = new byte[]{b};
            String lm = new String(tb);
            System.out.println("当前乱码"+lm);
            byte[] lm_b = lm.getBytes();
            System.out.println("-----------乱码 start--------");
            for(byte bn: lm_b){
                System.out.println(bn);
            }
            System.out.println("-----------乱码 end--------");
        }
        System.out.println(new String(b2,"gb2312"));
        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
        FileInputStream f3 = new FileInputStream(new File("F:\\bb.txt"));
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(f3));
        String readLine2 = bufferedReader.readLine();
        byte[] b3 = readLine2.getBytes("UTF-8");
        for(byte b : b3){
            System.out.println(b);
        }
        System.out.println(new String(b3));
        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");

        FileInputStream f4 = new FileInputStream(new File("F:\\bb.txt"));
        BufferedReader bufferedReader2 = new BufferedReader(new InputStreamReader(f4,"GB2312"));
        String readLine = bufferedReader2.readLine();
        byte[] b4 =readLine.getBytes("UTF-8");
        for(byte b : b4){
            System.out.println(b);
        }
        System.out.println(new String(b4));
        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
    }
}

通过分析打印结果:

-28 #字节1
-72 #字节2
-83 #字节3
中 #utf-8 解码后字符为:中,没有出现乱码
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-42 #字节1
当前乱码� #将 -42 按照utf-8 解码后的字符是乱码,然后再将乱码按照utf-8编码得到的字节如下
-----------乱码 start--------
-17
-65
-67
-----------乱码 end--------
-48 #字节2
当前乱码� ##将 -48 按照utf-8 解码后的字符是乱码,然后再将乱码按照utf-8编码得到的字节如下
-----------乱码 start--------
-17
-65
-67
-----------乱码 end--------
中 # 将 字节1: -42和字节2:-48 按照 gb2312 解码 后为字符 中
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-17 # 这里为readline()方法没有设置使用eclipse默认编码 默认使用utf-8 (读取bb.txt)
-65
-67
-17
-65
-67
�� # 输出的中文为乱码
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-28 #这里为readline()方法设置了编码为GB2312 读取一行文字为中 (读取bb.txt)
-72
-83

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

小结一下

new BufferedReader(new InputStreamReader(f4)); 默认用utf-8去解码字节,而bb.txt文件内容的字符是gb2312 所以该 中 字符在磁盘中占两个字节,而utf-8编码集中的中文占3个字节,而readline()的时候发现是两个字节,当前使用的又是utf-8,所以java底层就将这两个字节单独使用utf-8进行了解码, 每一个字节 使用utf-8编码一次为 一个char字符,所以经过utf-8将两个字节分别解码后的最终数据为两个乱码字符,

读者可以看上面的代码和打印的信息,两字符个乱码编码后的字节分别为-17 -65 -67(红色),和上面单独将一个字节用utf-8 接码后的字符再按照utf-8编码后得到的字节 -17 -65 -67(蓝色)一样,也就是说 当字节按照utf-8 解码时在utf-8编码集中找不到对应的正确的字符时就会默认作为� 输出,而� 对应的utf-8 字节 -17 -65 -67。所以当找不到对应正确的编码字符时都会按照 -17 -65 -67 对应的 字符 � 输出。

常识: 当使用 new BufferedReader(new InputStreamReader(f4),"文本源的编码") 文本源的编码一定要写。这样就不会有乱码。

调用readLine的乱码问题

readLine是一个很好用的方法,但是作为字符流的方法,确实会遇到各种关于编码方面的问题。但是用字节流来处理数据,比如说一个文本文件,要作按行处理的话,又会显得很不灵活。

下面提供的是readLine字符流指定编码方式的方法

//定义一个File对象
File someFile = new File("somefile.txt");
//输入流
FileInputStream fis = new FileInputStream(someFile);
InputStreamReader isr = new InputStreamReader(fis,"UTF-8"); //指定以UTF-8编码读入
BufferedReader br = new BufferedReader(isr);
//输出流
FileOutputStream fos = new FileOutputStream(someFile + ".生成的文件.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); //指定以UTF-8编码输出
while ((line = br.readLine()) != null) {
//osw.write("write something");
osw.write(line);
}
//关闭IO流
br.close();
osw.close();

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 解决java 命令行乱码的问题

    虚拟机参数加上 -Dfile.encoding=GBK -Ddefault.client.encoding=GBK -Duser.language=zh -Duser.region=CN 补充:java执行cmd命令,返回结果中文乱码问题解决 public static void main(String[] args) { try { // 执行ping命令 Process process = Runtime.getRuntime().exec("cmd /c e:&dir")

  • Java 的 FileFilter文件过滤与readline读行操作实例代码

    复制代码 代码如下: package com.cjonline.foundation.evisa; import java.io.BufferedReader;import java.io.File;import java.io.FileFilter;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.math.BigDecimal; publ

  • 基于自定义BufferedReader中的read和readLine方法

    实例如下所示: package day0208; import java.io.FileReader; import java.io.IOException; /* * 自定义读取缓冲区,实现BufferedReader功能 * 分析: * 缓冲区就是封装了一个数组,并对外提供了更多的方法对数组进行访问 * 其实这些方法最终操作的都是数组的角标 * 缓冲的原理: * 其实就是从源中获取一批数据装进缓冲区,再从缓冲区取出数据 * 当此次取完后,继续从源中取出一批数据到缓冲区 * 当源中的数据取光时

  • java 中http请求为了防止乱码解决方案

    java 中http请求为了防止乱码解决方案 今天做一个与地图有关的项目,需要发起http请求地图数据 写了一个工具类,希望大家都能用上吧 package com.lrdd.utils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter;

  • java 使用readLine() 乱码的解决

    目录 使用readLine() 乱码的解决 本人在公司开发程序遇到了读取 一行乱码 小结一下 调用readLine的乱码问题 下面提供的是readLine字符流指定编码方式的方法 使用readLine() 乱码的解决 本人在公司开发程序遇到了读取 一行乱码 eclipse 默认为utf-8 FileInputStream f4 = new FileInputStream(new File("F:\\bb.txt")); BufferedReader bufferedReader2 =

  • java 使用readLine() 乱码的解决

    目录 使用readLine() 乱码的解决 本人在公司开发程序遇到了读取一行乱码 小结一下 调用readLine的乱码问题 下面提供的是readLine字符流指定编码方式的方法 使用readLine() 乱码的解决 本人在公司开发程序遇到了读取一行乱码 eclipse 默认为utf-8 FileInputStream f4 = new FileInputStream(new File("F:\\bb.txt")); BufferedReader bufferedReader2 = ne

  • java页面中文乱码的解决办法

    在页面提交到tomcat乱码 解决方法是在tomcat/conf/server.xml中进行配置以tomcat6.0.32为例,需将以下代码:Xml代码 复制代码 代码如下: <Connectorport="8080"protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"/><Connector port="8080"

  • java中文传值乱码问题的解决方法

    本文实例为大家分享了java中文传值乱码问题,以及解决方法,供大家参考,具体内容如下 一般编码格式设置: 1.可以经过两次编码处理,即设置字符集后,在插入前解码字符集,也是最有效的方式 设置字符集: String value=null; try { value= URLEncoder.encode(jsonObjectPar.getString("value"), "UTF-8"); } catch (UnsupportedEncodingException e)

  • Java读取properties配置文件时,出现中文乱码的解决方法

    如下所示: public static String getConfig(String key) { Properties pros = new Properties(); String value = ""; try { pros.load(new InputStreamReader(Object.class.getResourceAsStream("/properties.properties"), "UTF-8")); value = pr

  • java表单提交中文乱码的解决方法

    本文实例为大家分享了java表单提交中文乱码的解决方法,供大家参考,具体内容如下 主页index.xml <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>servlet演示</title> </head> <body> <h2&

  • 如何解决java压缩文件乱码问题

    用java来打包文件生成压缩文件,有两个地方会出现乱码: 内容的中文乱码问题:修改sun的源码.使用开源的类库org.apache.tools.zip.ZipOutputStream和org.apache.tools.zip.ZipEntry,这两个类ant.jar中有,可以下载使用即可. 压缩文件注释的中文乱码问题:zos.setComment("中文测试");通过使用设置编码的方法(zos.setEncoding("gbk");)发现问题,测试项目的编码方式为g

  • jsp页面传参乱码的解决方法

    jsp页面传参乱码的解决方法 jsp页面js: encodeURIComponent要使用两次encodeURIComponent(encodeURIComponent(userAccount)); java:String  userAccount = java.net.URLDecoder.decode(userAccount,"UTF-8");/*需要处理异常*/ 纯属个人备注,以便后期使用

  • jQuery ajax方法传递中文时出现中文乱码的解决方法

    本文实例讲述了jQuery ajax方法传递中文时出现中文乱码的解决方法.分享给大家供大家参考,具体如下: 使用jQuery的ajax方法,在传递中文时出现中文乱码,按照以前的方法,修改了jquery文件中的ajaxSetting也不好使 复制代码 代码如下: sajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded;charse

  • Linux下JDK中文字体乱码的解决方法

    问题描述: 部署在linux下的java应用程序中的中文会变成一个一个的"口"字,也就是乱码 问题分析: 代码中使用了如下的实现方式: new java.awt.Font("宋体", Font.PLAIN, 12)那么jdk中一定需要"宋体"这个字体($JAVA_HOME/jre/lib/fonts目录下) 由于JDK默认没有中文字体,所以就会显示为乱码 需要手工设置一下,让java应用程序能够找到所需的中文字体 解决方式: 将需要的字体文件上传

随机推荐