中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

bufferedinputstream亂碼如何解決

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

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

bufferedinputstream亂碼是因為BufferedInputStream讀取的是字節byte,那么如果讀取的數據比較長,并且沒有一次性讀完,就會出現亂碼,其解決亂碼問題的辦法就是用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[]),就出了讀取出來現在部分的中文亂碼,我想是我這個byte[] tradb = new byte[1024];緩沖大小設置的問題,試圖去更改byte[]的在小,結果出現亂碼的地方和原先的不一樣了。也就說明了,在緩沖的末尾的時候出了問題,末尾的那個字節容納不了一個漢字,所以出現的亂碼。我想如果用read()去讀取的話應該不會出現這個問題的(沒試過)。像我的這種讀取大量的中文數據我想我寧愿用read去讀,大不了就開一個線程嘛。

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

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

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();
        // 關閉輸出流,寫入數據,如果下面還要寫用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,所以可能會出現讀到半個漢字的情況,就是亂碼.
        //BufferedReader繼承自Reader,該類的read方法讀取的是char,所以無論如何不會出現讀個半個漢字的.
        StringBuffer result = new StringBuffer();
        while (reader.ready()) {
            result.append((char)reader.read());
        }
        System.out.println(result.toString());
        reader.close();
 
 
    }
 
}

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

向AI問一下細節

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

AI

临沭县| 青阳县| 来宾市| 元江| 湟中县| 清新县| 泰州市| 藁城市| 子长县| 敦化市| 新和县| 宁阳县| 嵩明县| 丹东市| 宜都市| 乃东县| 绥化市| 桂东县| 永昌县| 扎鲁特旗| 中牟县| 布拖县| 大理市| 永靖县| 宜兰县| 陇南市| 夏河县| 夹江县| 隆昌县| 枣庄市| 寿光市| 鄱阳县| 土默特左旗| 连城县| 尚义县| 红河县| 仁寿县| 安泽县| 朝阳区| 淮阳县| 苍梧县|