用字节流读包含中文的文件出现乱码是不可避免的,简单的想想:单第一个字为英文,第二个子为中文,而一个英文占1一个字节,一个中文占两个字节,当你用两个字节的的数组读取,中文字就会被拆分,这样就肯定会出现乱码。
给你个解决方法代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Start{
public static void main(String[] args){
File fileS = new File("E:/123.txt");
if(!fileS.exists()){
System.out.println ("找不到指定文件");
return;
}
FileInputStream fileIS = null;
try{
fileIS = new FileInputStream(fileS);
byte[] byt = new byte[2];
int data = fileIS.read()(byt);
for (; data != -1 ; ){
int a=byt[0];
int b=byt[1];
if((a >= 0 && a <= 127) && (b > 127 || b < 0)){
System.out.print ((char)a);
data = fileIS.read()();
byt[0] = (byte)b;
byt[1] = (byte)data;
}
String str = new String(byt);
System.out.print (str);
data = fileIS.read()(byt);
}
System.out.println ();
}catch(FileNotFoundException ex){
ex.printStackTrace();
}catch(IOException ex){
ex.printStackTrace();
}finally{
if (fileIS != null) {
try{
fileIS.close();
}catch(IOException ex){
ex.printStackTrace();
}
}
}
}
}
假如没有汉字,字节读取有时也会出现乱码,例如
写入:
try {
//用流写
FileOutputStream fileOutstr = openFileOutput("inFileTest", MODE_PRIVATE);
String nerong = "hello inFile";
fileOutstr.write(nerong.getBytes()); //写
fileOutstr.close(); //不要忘记关闭流
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
读取:
try {
FileInputStream fileInstr = openFileInput("inFileTest");
byte[] bs = new byte[100];
fileInstr.read(bs);
fileInstr.close();
//把结果打印到TextView中
t.setText(bs.toString); //结果出现乱码
//改为 //t.setText(new String(bs)); //就好
} catch (FileNotFoundException e) {
//
TODO Auto-generated catch block
e.printStackTrace();
} catch
(IOException e) {
//
TODO Auto-generated catch block
e.printStackTrace();
}
原因:
toString()的默认实现是打印对象类型+hashCode() [B表示byte数组
@表示之后的是地址 后面跟着的hashCode,其实就是其虚拟机地址.
但是使用new String()构造方法将byte[]转换为字符串得到的就会是一个根据字节数组内容构造的字符串。