java 字节乱码_Android/Java 字节读取出现乱码问题

本文探讨了使用字节流读写包含中文的文件时可能出现的乱码问题,指出当英文和中文混合时,由于字节长度不同可能导致乱码。提供了一段Java代码示例来避免这种情况,通过检查字节范围并重新组合来正确显示中文。同时,解释了读取字节流后直接调用toString()方法导致的乱码原因,并给出了正确的转换方式。
摘要由CSDN通过智能技术生成

用字节流读包含中文的文件出现乱码是不可避免的,简单的想想:单第一个字为英文,第二个子为中文,而一个英文占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[]转换为字符串得到的就会是一个根据字节数组内容构造的字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值