您好,登錄后才能下訂單哦!
本篇內容介紹了“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亂碼如何解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。