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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小黑子 中级黑马   /  2014-10-10 17:27  /  2746 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小黑子 于 2014-10-11 22:14 编辑

毕老师说,字符流实际上就是调用的字节流,只不过字符流里面有编码表。
然后我就理解为字符流中的编码表,字节流中没有编码表。写了个字节流读写文件的代码来验证自己的想法:
  1. import java.io.FileInputStream;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;

  4. class InputOutputStreamDemo
  5. {
  6.         public static void main(String[] args) throws IOException
  7.         {
  8.                 FileInputStream fis = new FileInputStream("PropertiesDemo.java");
  9.                 FileOutputStream fos = new FileOutputStream("F:/PropertiesDemo.txt");

  10.                 //一次读一个
  11.                 int b = 0;
  12.                 while((b=fis.read())!=-1)
  13.                 {
  14.                         fos.write(b);
  15.                 }

  16.                 fis.close();
  17.                 fos.close();

  18.         }
  19. }
复制代码
在这个fis所读取的文件中,  中文  和 英文  都有。 结果中、英都能在PropertiesDemo.txt中正常显示。问题1 :如果字节流中没有编码表,那么读取的中文为什么会正常写入另一个文件???一个中文不是占两个字节么?而字节流是一个字节一个字节读,一个字节一个字节存的啊。
问题2 :那字节流中的英文又是怎么进行读写的呢?我猜想的是:

            假设:读文件  PropertiesDemo.java  中存在一个字母  A  (它的ASCII码为:01000001)
                       则读取流中就会读入01000001
                      然后输出流中获取这个01000001,将之强转为char再写入到文件  PropertiesDemo.txt 中
             我的猜想对不对呢?

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

12 个回复

倒序浏览
大神在哪里?马友在哪里?
回复 使用道具 举报
文本文件也是文件,字节流连mp3都能复制,文本文件当然更能复制。而且你读取一个字节就写入一个,程序里面根本没有针对文本文件做过处理,完全不关字符集的事。
回复 使用道具 举报
水竹 发表于 2014-10-10 18:10
文本文件也是文件,字节流连mp3都能复制,文本文件当然更能复制。而且你读取一个字节就写入一个,程序里面 ...

对呀,是读一个字节就写一个字节。这样一个汉字就分成两次才写入了文件。那么既然没有编码表,计算机又是如何知道,何时该把两个字节组成一个汉字显示,何时把一个字节作为英文显示呢?
回复 使用道具 举报
小黑子 发表于 2014-10-10 19:04
对呀,是读一个字节就写一个字节。这样一个汉字就分成两次才写入了文件。那么既然没有编码表,计算机又是 ...

你根本没在程序里面显示汉字啊……
我就没明白你就复制了一个文件怎么就想到的这些……
一个汉字分两次写入又怎么了,你又没改变那两个字节的顺序,原来什么样复制完了不还什么样么。
比如我杀了个人,要处理尸体,我把她直接装袋运走埋了,跟我先把尸体分成两爿,然后分着运出去,到了地方之后再缝起来有什么区别?不还是一具尸体么。不同的地方只是在途中,她是一整个尸体还是两半的尸体,但是你中间不是啥都没做么,你不就只是简简单单复制了一下么。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 这个比喻。。。

查看全部评分

回复 使用道具 举报
好像不是说字符流中有编码表,而是字符流将字节流与编码表结合,边读字节边查表。我的理解是字符流就像有一个很小的缓存,读到字节后,存起来,然后查表,然后再按字符传输。字节是在读完之后统一查表。个人理解,错误率较高
回复 使用道具 举报
水竹 发表于 2014-10-10 19:24
你根本没在程序里面显示汉字啊……
我就没明白你就复制了一个文件怎么就想到的这些……
一个汉字分两次写 ...

额……那我问题2的猜想对不对呢。。。
回复 使用道具 举报
我觉得这应该是文本程序的作用了,它拿到一个一个字节自己解析出来,让我们看到的,就像 联通 这个bug一样,我们输入的直接就是汉字,但是文本打开却成了乱码,
回复 使用道具 举报
水竹 中级黑马 2014-10-11 10:02:44
9#
本帖最后由 水竹 于 2014-10-11 10:04 编辑
小黑子 发表于 2014-10-11 05:42
额……那我问题2的猜想对不对呢。。。

字节流中用的不是char,而是byte,读取的时候读一个byte返回的是int,写入的时候传入int,写入流自动转换成byte存的,而且不只是英文字符,所有字符都是这么存的,就算你不是操作的文本文件,MP3它也是这么存的。
之所以读取时候返回int,是因为为了和byte中的-1相区分,文本文件或许没这种顾虑,但是其他二进制文件可能会有用到八位全是1的情况,比如说基础视频里面mp3文件第一个字节的八位全都是1,所以如果读取流直接返回byte类型的话,会无法区分这个byte类型的-1到底是正常字节还是文件已经到末尾。
怎么区分的?就是将其扩充成int,然后这个int的高24位全变成0;写成十六进制就是0x00000FF,而文件真正到达末尾的时候,返回的是int型的-1,也就是OxFFFFFFFF。
想不清楚的话,或者不知道自己是否想清楚了的话想这样一个问题:
字节流读取一个字节的方法有几种返回值?答案是257种,-1~255都有可能返回,-1就是文件读取到末尾了,255就是将八个1的字节填充24个0之后得到的int数值。
写入的时候传入int类型参数,写入流接收后将其强转成byte,高24位丢弃,不是char。
看到这里,你应该知道你那个“那字节流中的英文又是怎么进行读写的呢?”有什么问题,那就是我前面楼层一直在说的,字节流根本不管你是不是英文,是不是非英文字符,是不是其他类型的数据,它从来没有针对英文或者其他什么进行操作,它只是一个字节一个字节的读罢了,根本没有“又”怎么怎么样,而是“一直都在”怎么样。
回复 使用道具 举报
你读取的是硬盘上已经编好码的数据,用记事本或NodePad+查看一下知道,要么是GBK,要么是UTF-8。在字节流中读取时是不进行编解码操作的。
回复 使用道具 举报
水竹 发表于 2014-10-11 10:02
字节流中用的不是char,而是byte,读取的时候读一个byte返回的是int,写入的时候传入int,写入流自动转换 ...

或许是我表述的不明确,你的答案一直不是我想要的。
我想问的是:
                  既然是字节流将数据从一个文本转存到另一个文本中,字节流中的数据全都是10的二进制,
                  那是谁把这些二进制转化为我们可以读懂的abcd呢?
回复 使用道具 举报
水竹 中级黑马 2014-10-11 22:12:53
12#
小黑子 发表于 2014-10-11 22:07
或许是我表述的不明确,你的答案一直不是我想要的。
我想问的是:
                  既然是字节流将数据 ...

记事本……
回复 使用道具 举报

:L原来是这样………………………………结帖
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马