黑马程序员技术交流社区

标题: 关于inputStream [打印本页]

作者: 轩辕迪卡    时间: 2013-11-12 10:08
标题: 关于inputStream

  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, 下载次数: 590


作者: ysunday    时间: 2013-11-12 10:58
刚才用debug看了下你的程序,估计是每个文件的开头是有文件标识的,而你的乱码也是因为把文件开头的标识读取进去所引起的。
因为刚才看见的in[i]前3个数都是小于0的负数。所以输出了乱码

在9行和10行加上
if(in[i] > 0)
这个就可以解决了。
让in[i]小于0的不输出就行了
作者: 秦桂胜    时间: 2013-11-12 11:10
这是由于读文本时,先把文本对应数码表的数码读出,然后再读里面的数据,所以说在转换char值是出现错码,例如你把转换去掉看看打印结果。开头是-17-69-65
作者: ysunday    时间: 2013-11-12 11:11
这几个负数是-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.         }
复制代码

作者: lichao    时间: 2013-11-12 11:26
你的代码没有问题,只是你txt文件的问题。你在换一个txt文件就可以了。我自己新建了一个,运行没有乱码。

you and i.zip

556 Bytes, 下载次数: 572


作者: 秦桂胜    时间: 2013-11-12 11:34
ysunday 发表于 2013-11-12 11:11
这几个负数是-17-69-65也或许是表示中文字符的东西。
刚才查的
ASCII小于0的,用作MultiBytes,如果两个ASCII ...

谢谢提醒,这个我也是猜的:lol
作者: 轩辕迪卡    时间: 2013-11-12 11:45
我感觉代码应该是没有问题,我把文件名命名为abc.txt就没问题,那以后如果需要读取这类的文件怎么办呢?
作者: 赵晓海    时间: 2013-11-12 13:06
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编码格式保存。







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2