最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java?使用readLine()?亂碼的解決

 更新時(shí)間:2021年12月09日 11:46:06   作者:學(xué)習(xí)筆記cmj  
這篇文章主要介紹了java使用readLine()亂碼的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

使用readLine() 亂碼的解決

本人在公司開(kāi)發(fā)程序遇到了讀取一行亂碼

eclipse 默認(rèn)為utf-8

FileInputStream f4 = new FileInputStream(new File("F:\\bb.txt"));
BufferedReader bufferedReader2 = new BufferedReader(new InputStreamReader(f4));
String readLine = bufferedReader2.readLine(); //會(huì)輸出亂碼

測(cè)試文件有兩個(gè)文本文件分別為,aa.txt (UTF-8編碼),bb.txt(GB2312編碼)兩個(gè)文件中的內(nèi)容都為一個(gè)字符 中:

前提知識(shí): utf-8中文占三個(gè)字節(jié),GB2312中文占兩個(gè)字節(jié)

測(cè)試 代碼:

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[];
            String lm = new String(tb);
            System.out.println("當(dāng)前亂碼"+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("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
    }
}

通過(guò)分析打印結(jié)果:

-28 #字節(jié)1
-72 #字節(jié)2
-83 #字節(jié)3
中 #utf-8 解碼后字符為:中,沒(méi)有出現(xiàn)亂碼
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-42 #字節(jié)1
當(dāng)前亂碼? #將 -42 按照utf-8 解碼后的字符是亂碼,然后再將亂碼按照utf-8編碼得到的字節(jié)如下
-----------亂碼 start--------
-17
-65
-67
-----------亂碼 end--------
-48 #字節(jié)2
當(dāng)前亂碼? ##將 -48 按照utf-8 解碼后的字符是亂碼,然后再將亂碼按照utf-8編碼得到的字節(jié)如下
-----------亂碼 start--------
-17
-65
-67
-----------亂碼 end--------
中 # 將 字節(jié)1: -42和字節(jié)2:-48 按照 gb2312 解碼 后為字符 中
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-17 # 這里為readline()方法沒(méi)有設(shè)置使用eclipse默認(rèn)編碼 默認(rèn)使用utf-8 (讀取bb.txt)
-65
-67
-17
-65
-67
?? # 輸出的中文為亂碼
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-28 #這里為readline()方法設(shè)置了編碼為GB2312 讀取一行文字為中 (讀取bb.txt)
-72
-83

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

小結(jié)一下

new BufferedReader(new InputStreamReader(f4)); 默認(rèn)用utf-8去解碼字節(jié),而bb.txt文件內(nèi)容的字符是gb2312 所以該 中 字符在磁盤(pán)中占兩個(gè)字節(jié),而utf-8編碼集中的中文占3個(gè)字節(jié),而readline()的時(shí)候發(fā)現(xiàn)是兩個(gè)字節(jié),當(dāng)前使用的又是utf-8,所以java底層就將這兩個(gè)字節(jié)單獨(dú)使用utf-8進(jìn)行了解碼, 每一個(gè)字節(jié) 使用utf-8編碼一次為 一個(gè)char字符,所以經(jīng)過(guò)utf-8將兩個(gè)字節(jié)分別解碼后的最終數(shù)據(jù)為兩個(gè)亂碼字符,

讀者可以看上面的代碼和打印的信息,兩字符個(gè)亂碼編碼后的字節(jié)分別為-17 -65 -67(紅色),和上面單獨(dú)將一個(gè)字節(jié)用utf-8 接碼后的字符再按照utf-8編碼后得到的字節(jié) -17 -65 -67(藍(lán)色)一樣,也就是說(shuō) 當(dāng)字節(jié)按照utf-8 解碼時(shí)在utf-8編碼集中找不到對(duì)應(yīng)的正確的字符時(shí)就會(huì)默認(rèn)作為? 輸出,而? 對(duì)應(yīng)的utf-8 字節(jié) -17 -65 -67。所以當(dāng)找不到對(duì)應(yīng)正確的編碼字符時(shí)都會(huì)按照 -17 -65 -67 對(duì)應(yīng)的 字符 ? 輸出。

常識(shí): 當(dāng)使用 new BufferedReader(new InputStreamReader(f4),"文本源的編碼") 文本源的編碼一定要寫(xiě)。這樣就不會(huì)有亂碼。

調(diào)用readLine的亂碼問(wèn)題

readLine是一個(gè)很好用的方法,但是作為字符流的方法,確實(shí)會(huì)遇到各種關(guān)于編碼方面的問(wèn)題。但是用字節(jié)流來(lái)處理數(shù)據(jù),比如說(shuō)一個(gè)文本文件,要作按行處理的話,又會(huì)顯得很不靈活。

下面提供的是readLine字符流指定編碼方式的方法

//定義一個(gè)File對(duì)象
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);
}
//關(guān)閉IO流
br.close();
osw.close();

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring @Component自定義注解實(shí)現(xiàn)詳解

    Spring @Component自定義注解實(shí)現(xiàn)詳解

    @Component是一個(gè)元注解,意思是可以注解其他類(lèi)注解,如@Controller @Service @Repository @Aspect。官方的原話是:帶此注解的類(lèi)看為組件,當(dāng)使用基于注解的配置和類(lèi)路徑掃描的時(shí)候,這些類(lèi)就會(huì)被實(shí)例化
    2022-09-09
  • Java設(shè)計(jì)模式之外觀模式示例詳解

    Java設(shè)計(jì)模式之外觀模式示例詳解

    外觀模式為多個(gè)復(fù)雜的子系統(tǒng),提供了一個(gè)一致的界面,使得調(diào)用端只和這個(gè)接口發(fā)生調(diào)用,而無(wú)須關(guān)系這個(gè)子系統(tǒng)內(nèi)部的細(xì)節(jié)。本文將通過(guò)示例詳細(xì)為大家講解一下外觀模式,需要的可以參考一下
    2022-03-03
  • Mac系統(tǒng)搭建JDK及JMETER過(guò)程解析

    Mac系統(tǒng)搭建JDK及JMETER過(guò)程解析

    這篇文章主要介紹了Mac系統(tǒng)搭建JDK及JMETER過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 啟用Spring事務(wù)管理@EnableTransactionManagement示例解析

    啟用Spring事務(wù)管理@EnableTransactionManagement示例解析

    這篇文章主要為大家介紹了啟用Spring事務(wù)管理@EnableTransactionManagement示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Java?策略模式?if-else用法實(shí)例詳解

    Java?策略模式?if-else用法實(shí)例詳解

    這篇文章主要介紹了Java?策略模式?if-else用法詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • 線程池之jdk1.8 Executors創(chuàng)建線程池的幾種方式

    線程池之jdk1.8 Executors創(chuàng)建線程池的幾種方式

    這篇文章主要介紹了線程池之jdk1.8 Executors創(chuàng)建線程池的幾種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 使用spring容器在初始化Bean時(shí)前和后的操作

    使用spring容器在初始化Bean時(shí)前和后的操作

    這篇文章主要介紹了使用spring容器在初始化Bean時(shí)前和后的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 對(duì)Netty組件的基本介紹

    對(duì)Netty組件的基本介紹

    這篇文章主要介紹了對(duì)Netty組件的基本介紹,Netty是基于Java NIO client-server的網(wǎng)絡(luò)應(yīng)用框架,使用Netty可以快速開(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用,本文涵蓋了netty開(kāi)發(fā)中主要的組件的介紹,需要的朋友可以參考下
    2021-06-06
  • spring boot 常見(jiàn)http請(qǐng)求url參數(shù)獲取方法

    spring boot 常見(jiàn)http請(qǐng)求url參數(shù)獲取方法

    這篇文章主要介紹了spring boot 常見(jiàn)http請(qǐng)求url參數(shù)獲取,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 解決logback的日志文件路徑問(wèn)題

    解決logback的日志文件路徑問(wèn)題

    這篇文章主要介紹了解決logback的日志文件路徑問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02

最新評(píng)論

昆山市| 永寿县| 南雄市| 广宁县| 隆化县| 克拉玛依市| 上犹县| 定襄县| 乌兰县| 沂南县| 桓台县| 鸡泽县| 拜城县| 滁州市| 文安县| 台江县| 高碑店市| 内黄县| 泽州县| 浠水县| 湟源县| 永丰县| 凤冈县| 南和县| 年辖:市辖区| 黑水县| 元氏县| 出国| 青龙| 会泽县| 河津市| 普陀区| 南康市| 台前县| 湘西| 广安市| 金沙县| 饶河县| 南阳市| 哈巴河县| 依兰县|