A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梁志仲 中级黑马   /  2012-8-25 12:52  /  2616 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.io.*;
public class Test
{
public static void main(String[] args)throws Exception
{
  FileInputStream fis = new FileInputStream("1.txt");
  FileOutputStream fos = new FileOutputStream("2.txt");
  byte[] b = new byte[5];
   int n;  
   while((n=fis.read(b))!=-1)
  {
    System.out.print(new String(b,0,n));   //为什么直接打印的中文是乱码
    fos.write(b,0,n); //写入文本文件的中文正常
  }
  fis.close();
  fos.close();
}
}

请高手详细分析下直接打印到控制台的中文是乱码,而写入文件中则正常。

4 个回复

倒序浏览
编码问题。。。
回复 使用道具 举报
本帖最后由 刘源 于 2012-8-25 13:59 编辑

System.out.print(new String(b,0,n));   //为什么直接打印的中文是乱码
fos.write(b,0,n); //写入文本文件的中文正常
先说说,为什么fos.write(b,0,n); 正常,因为write方法,虽然接收的是一个字节数组,但底层调用的还是一字节一个字节这么往里面写的,字节流必然操作的必然是字节。
System.out.print(new String(b,0,n));而他为什么不正常?你读一个长度为5的字节数组,然后将其转换为字符串打印,然后重复一遍,这2个字符串是单独的个体,没有练习的。所以就会出现,一个字符串包含半个中文字,那一个也包含半个,就成乱码了。
最后说说怎么改:
既然你的知道writer方法好用,那你只需要把输出地址变成:OutputStream os =System.out;不就行了吗。然后用os.writer(b,0,n)方法不就输出到控制台上了

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 恭喜!

查看全部评分

回复 使用道具 举报
恩,我在做入学测试就遇到这个题,当时也是楼主这样,什么原因楼上说的正确。现在用手机,楼上解决办法行不行就不知道了。我当时是定义了一个字节流的缓冲区,先将读到的字节写入缓冲字节数组中,然后统一转成字符串打印到控制台就不会出乱码了
回复 使用道具 举报
编码的问题 在后边加上"UFT-8"
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马