首頁 常見問題 bufferedinputstream亂碼怎麼辦

bufferedinputstream亂碼怎麼辦

Mar 22, 2023 am 11:22 AM
亂碼

bufferedinputstream乱码是因为BufferedInputStream读取的是字节byte,那么如果读取的数据比较长,并且没有一次性读完,就会出现乱码,其解决乱码问题的办法就是用BufferedReader来读取,其读取代码如“BufferedReader reader = new BufferedReader (...)”。

bufferedinputstream亂碼怎麼辦

本教程操作环境:Windows10系统、Java8.0、Dell G3电脑。

bufferedinputstream乱码怎么办?

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(&#39;" + pinyin.getPinyin(simplsb.substring(i, i + 1)) + "&#39;,&#39;"
                                + simplsb.substring(i, i + 1) + "&#39;,&#39;" + tradsb.substring(i, i + 1) + "&#39;)");
            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();
 
 
    }
 
}
登入後複製

推荐学习:《Java视频教程

以上是bufferedinputstream亂碼怎麼辦的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

word頁碼亂碼怎麼解決 word頁碼亂碼怎麼解決 Jun 25, 2023 pm 03:23 PM

word頁碼亂碼的解決方法:1、開啟word文檔,點選左上角的「文件」選項;2、選擇「更多」選項,再點選「選項」按鈕;3、在word選項中選擇「進階」;4 、在“顯示文件內容”中找到“顯示域代碼而非域值”,去掉前方的勾選,並點擊確定,回到主頁即可。

Linux中文亂碼怎麼解決 Linux中文亂碼怎麼解決 Feb 21, 2024 am 10:48 AM

Linux中文亂碼問題是使用中文字元集和編碼時常見的一個問題。出現亂碼的原因可能是檔案編碼設定不正確,系統語言環境未安裝或未設置,以及終端顯示設定錯誤等。本文將介紹幾種常見的解決方法,並提供具體的程式碼範例。一、檢查檔案編碼設定使用file指令查看檔案編碼在終端機中使用file指令,可以檢視檔案的編碼:file-ifilename如果輸出中有"charset

tomcat啟動亂碼如何解決 tomcat啟動亂碼如何解決 Dec 26, 2023 pm 05:21 PM

tomcat啟動亂碼的解決方法:1、修改Tomcat的conf設定檔;2、修改系統語言;3、修改命令列視窗編碼;4、檢查Tomcat伺服器設定;5、檢查項目編碼;6、檢查日誌檔;7 、嘗試其他解決方案。詳細介紹:1、修改Tomcat的conf設定文件,開啟Tomcat的conf目錄,找到"logging.properties"檔案等等。

解決Windows10中文亂碼問題的方法 解決Windows10中文亂碼問題的方法 Jan 16, 2024 pm 02:21 PM

在Windows10系統中,出現亂碼現象可謂司空見慣。這背後的原因往往在於該作業系統並未對部分字元集提供預設的支持,抑或是設定的字元集選項有錯誤。為了對症下藥,以下我們將為您詳細解析實際的操作規程。 windows10亂碼怎麼解決1、開啟設置,找到「時間和語言」2、再找到「語言」3、找到「管理語言設定」4、點選這裡的「更改系統區域設定」5、如圖勾選上然後點擊確定就可以了。

linux tty中文亂碼怎麼辦 linux tty中文亂碼怎麼辦 Mar 16, 2023 am 09:20 AM

linux tty中文亂碼的解決方法:1、透過「sudo apt-get install fbterm」指令下載字型fbterm;2、執行「sudo fbterm」指令;3、變更字型和字型大小為「font-names=Ubuntu Mono font- size=14”即可。

win11系統文件出現亂碼怎麼解決 win11系統文件出現亂碼怎麼解決 Jun 29, 2023 pm 06:29 PM

win11文字文檔亂碼怎麼解決?許多使用者在使用win11系統的時候出現了文本文檔亂碼的情況而導致無法正常的進行閱讀,出現這個問題很多小伙伴都不知道該如何解決。其實這個方法並不難,下面小編整理了windows11系統文件亂碼解決步驟,希望能帶給大家一點啟發! windows11系統文件亂碼解決步驟1、首先,開啟win11的控制面板,在下面的搜尋框中輸入控制面板,點選搜索,進入控制面板。 2.進入面板後,找到時鐘和區域並點選進入,再點選區域選項。 3.進入後,點選管理面板,再點選更改系統區域設定。

filezilla亂碼怎麼解決 filezilla亂碼怎麼解決 Nov 20, 2023 am 10:16 AM

filezilla亂碼的解決方法有:1、檢查編碼設定;2、檢查檔案本身;3、檢查伺服器設定;4、嘗試其他傳輸工具;5、更新軟體版本;6、檢查網路問題;7、尋求技術支援。解決FileZilla亂碼問題需要從多個方面入手,逐步排除問題原因,並採取相應的措施進行修復。

解決dll檔案開啟亂碼問題的編輯方式 解決dll檔案開啟亂碼問題的編輯方式 Jan 06, 2024 pm 07:53 PM

有很多的用戶在使用電腦的時候,會發現有很多的文件的尾綴是dll,但是很多的用戶們都不知道這種文件需要怎麼打開,想要知道的用戶們快來看看以下詳細教程吧~dll檔案怎麼打開編輯:1、下載一個​​叫做「exescope」的軟體,並下載安裝。 2、然後右鍵dll文件,選擇「用exescope編輯資源」。 3、然後在彈出的錯誤提示框中,點選「確定」。 4、然後在右邊的面板上,點擊每個組前面的「+」號可以查看到它所包含的內容。 5.點選需要檢視的dll文件,就能夠看到了,然後點選“文件”,選擇“匯出”。 6、然後就能夠