溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

bufferedinputstream亂碼如何解決

發(fā)布時間:2023-03-22 11:33:56 來源:億速云 閱讀:242 作者:iii 欄目:開發(fā)技術

本篇內(nèi)容介紹了“bufferedinputstream亂碼如何解決”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

bufferedinputstream亂碼是因為BufferedInputStream讀取的是字節(jié)byte,那么如果讀取的數(shù)據(jù)比較長,并且沒有一次性讀完,就會出現(xiàn)亂碼,其解決亂碼問題的辦法就是用BufferedReader來讀取,其讀取代碼如“BufferedReader reader = new BufferedReader (...)”。

BufferedInputStream和BufferedOutputStream用法解決亂碼

昨晚寫了一個把所有的簡體漢字轉換成繁體并且取出拼音的程序,在IO流操作中遇到了中文亂碼問題。

下面是我寫的程序

package com.java.utils.charactor;
 
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
 
/**
 * 簡繁體轉換
 *
 * @author pengjianbo <pengjianbosoft@gmail.com>
 * $Id$
 */
public class SimTradConvert {
 
    public SimTradConvert() throws Exception {
 
        File simplFile = new File(
                "D:\\android\\JavaUtils\\src\\com\\java\\utils\\charactor\\simplified.txt");
        FileInputStream simplFis = new FileInputStream(simplFile);
        BufferedInputStream simplBis = new BufferedInputStream(simplFis);
        BufferedReader simplBr = new BufferedReader(new InputStreamReader(simplBis));
        StringBuffer simplsb = new StringBuffer();
 
        byte[] simplb = new byte[1024];
        while ((simplBis.read(simplb)) != -1) {
            simplsb.append(new String(simplb));
        }
        
        simplFis.close();
        simplBis.close();
        
        
        File tradFile = new File(
                "D:\\android\\JavaUtils\\src\\com\\java\\utils\\charactor\\traditional.txt");
        FileInputStream tradFis = new FileInputStream(tradFile);
        BufferedInputStream tradBis = new BufferedInputStream(tradFis);
        StringBuffer tradsb = new StringBuffer();
 
        byte[] tradb = new byte[1024];
        while ((tradBis.read(tradb)) != -1) {
            tradsb.append(new String(tradb));
        }
        
        tradBis.close();
        tradFis.close();
        
        System.out.println(simplsb.toString());
        /*CnGetPinyin pinyin = new CnGetPinyin();
        //連接SQLite的JDBC
        Class.forName("org.sqlite.JDBC");
        Connection conn = DriverManager.getConnection("jdbc:sqlite:pai.db");
        Statement stat = conn.createStatement();
        for(int i = 0; i < simplsb.length() -1; i++ ) {
            
            stat.executeUpdate( "insert into CNLang(pinyin,simp,trad) values('" + pinyin.getPinyin(simplsb.substring(i, i + 1)) + "','"
                                + simplsb.substring(i, i + 1) + "','" + tradsb.substring(i, i + 1) + "')");
            System.out.println("正在添加:" + simplsb.substring(i, i + 1) + "-->"  + tradsb.substring(i, i + 1));
            if( i > simplsb.length() -1 ) {
                stat.close();
                conn.close();
            }
        }*/
        
    }
 
    public static void main(String[] args) throws Exception {
        new SimTradConvert();
    }
 
}

在我的這個程序中,用BufferedInputStream,而且用了read(byte[]),就出了讀取出來現(xiàn)在部分的中文亂碼,我想是我這個byte[] tradb = new byte[1024];緩沖大小設置的問題,試圖去更改byte[]的在小,結果出現(xiàn)亂碼的地方和原先的不一樣了。也就說明了,在緩沖的末尾的時候出了問題,末尾的那個字節(jié)容納不了一個漢字,所以出現(xiàn)的亂碼。我想如果用read()去讀取的話應該不會出現(xiàn)這個問題的(沒試過)。像我的這種讀取大量的中文數(shù)據(jù)我想我寧愿用read去讀,大不了就開一個線程嘛。

下面是我看到網(wǎng)上別人寫的博客:后來在網(wǎng)上找一下資料,轉載如下:

BufferedInputStream和BufferedOutputStream是過濾流,需要使用已存在的節(jié)點來構造,即必須先有InputStream或OutputStream,相對直接讀寫,這兩個流提供帶緩存的讀寫,提高了系統(tǒng)讀寫效率性能.BufferedInputStream讀取的是字節(jié)byte,因為一個漢字占兩個字節(jié),而當中英文混合的時候,有的字符占一個字節(jié),有的字符占兩個字節(jié),所以如果直接讀字節(jié),而數(shù)據(jù)比較長,沒有一次讀完的時候,很可能剛好讀到一個漢字的前一個字節(jié),這樣,這個中文就成了亂碼,后面的數(shù)據(jù)因為沒有字節(jié)對齊,也都成了亂碼.所以我們需要用BufferedReader來讀取,它讀到的是字符,所以不會讀到半個字符的情況,不會出現(xiàn)亂碼.

package com.pocketdigi;
 
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        File f = new File("d:/a.txt");
        FileOutputStream fos = new FileOutputStream(f);
        // 構建FileOutputStream對象,文件不存在會自動新建
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        bos.write("1我是中文".getBytes());
        bos.close();
        // 關閉輸出流,寫入數(shù)據(jù),如果下面還要寫用flush();
        // 因為是BufferOutputStream鏈接到FileOutputStream,只需關閉尾端的流
        // 所以不需要關閉FileOutputStream;
        FileInputStream fis = new FileInputStream(f);
        BufferedInputStream bis = new BufferedInputStream(fis);
        BufferedReader reader = new BufferedReader (new InputStreamReader(bis));
        //之所以用BufferedReader,而不是直接用BufferedInputStream讀取,是因為BufferedInputStream是InputStream的間接子類,
        //InputStream的read方法讀取的是一個byte,而一個中文占兩個byte,所以可能會出現(xiàn)讀到半個漢字的情況,就是亂碼.
        //BufferedReader繼承自Reader,該類的read方法讀取的是char,所以無論如何不會出現(xiàn)讀個半個漢字的.
        StringBuffer result = new StringBuffer();
        while (reader.ready()) {
            result.append((char)reader.read());
        }
        System.out.println(result.toString());
        reader.close();
 
 
    }
 
}

“bufferedinputstream亂碼如何解決”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI