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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 轩辕迪卡 中级黑马   /  2013-11-12 10:08  /  1544 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. public class TestInputStream {
  2.         public static void main(String[] args) throws IOException {

  3.                 InputStream inputStream = new FileInputStream("D:\\you and i.txt");
  4.                 byte[] in = new byte[10];
  5.                 int len = 0;
  6.                 while ((len = inputStream.read(in)) != -1) {                       
  7.                         for (int i = 0; i <len; i++) {
  8.                                 System.out.print((char)in[i]);
  9.                         }
  10.                 }
  11.                 inputStream.close();
  12.         }
  13. }
复制代码
大家看一下为啥我输出的前几个字符 是乱码呢?

you and i.zip

562 Bytes, 下载次数: 516

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
刚才用debug看了下你的程序,估计是每个文件的开头是有文件标识的,而你的乱码也是因为把文件开头的标识读取进去所引起的。
因为刚才看见的in[i]前3个数都是小于0的负数。所以输出了乱码

在9行和10行加上
if(in[i] > 0)
这个就可以解决了。
让in[i]小于0的不输出就行了

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1

查看全部评分

回复 使用道具 举报
这是由于读文本时,先把文本对应数码表的数码读出,然后再读里面的数据,所以说在转换char值是出现错码,例如你把转换去掉看看打印结果。开头是-17-69-65
回复 使用道具 举报
这几个负数是-17-69-65也或许是表示中文字符的东西。
刚才查的
ASCII小于0的,用作MultiBytes,如果两个ASCII,第一个是负数,那么它会跟后面的一个字符连接,组成Multibytes,显示为系统语言代码页的字符.windows中文的语言默认的语言代码页是中文(936).所以显示中文.
也没读懂。
  1.         while ((len = inputStream.read(in)) != -1) {                       
  2.                 for (int i = 0; i <len; i++) {
  3.                                 if(in[i] > 0)
  4.                         System.out.print((char)in[i]);
  5.                 }
  6.         }
复制代码
回复 使用道具 举报
你的代码没有问题,只是你txt文件的问题。你在换一个txt文件就可以了。我自己新建了一个,运行没有乱码。

you and i.zip

556 Bytes, 下载次数: 509

回复 使用道具 举报
ysunday 发表于 2013-11-12 11:11
这几个负数是-17-69-65也或许是表示中文字符的东西。
刚才查的
ASCII小于0的,用作MultiBytes,如果两个ASCII ...

谢谢提醒,这个我也是猜的:lol
回复 使用道具 举报
我感觉代码应该是没有问题,我把文件名命名为abc.txt就没问题,那以后如果需要读取这类的文件怎么办呢?
回复 使用道具 举报
java编码与txt编码对应

java              txt

utf-8            utf-8

utf-16          unicode

unicode       unicode big endian

gb2312        ANSI

经测试四种编码格式在txt文件中开头对应的数值

utf-8:-17 -69 -65

UTF-16:-1 -2

unicode:-2 -1

ANSI: 经测试,此编码格式没有对应的标识数值(我也不知道为什么)

出现乱码是因为按字节读取时读到了文件的编码格式信息,我现在知道的解决方法有两个:

一、二楼的方法,更改代码,加一个判断。

二、把txt文件用ANSI编码格式保存。


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马