黑马程序员技术交流社区

标题: 字节流与字符流 [打印本页]

作者: 何阳    时间: 2012-5-10 00:20
标题: 字节流与字符流
关于什么时候使用字节流与字符流
    1、我们在硬盘上保存的数据都是字节流,当我们从C盘复制到D盘一个记事本文件,为什么选择字符而不是字符,我们根本不需要查表,因为我们的目标是将硬盘上的文件复制,我们并不需要看的懂,复制完成时我们可以使用记事本解码。
   2、我们将键盘上输入的保存到硬盘上,我们知道输入和输出都是字节流,【为什么我们还需要转换流,将键盘上的字节流转换成字符流,然后将字符流在转成字节存入到硬盘。虽然我们在键盘输入的是“你好”,键盘上的每个字母都对应有字节,在内存还是字节的形式,只不过我们看上去好像是字符一样。】突然发现,键盘对应的都是一个字符,像啊a,c,d等等。而非字节,那为什么键盘输入你字节流呢?
    3、上网查的一些资料是这样说的
     开发中究竟用字节流好还是用字符流好呢?
在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。
     java读取文件的方式分为两种:一种是Reader《字符流》,一种是InputStream《字节流》,他们两个是平级的,没有继承关系。但是可以通过InputStreamReader进行转换,将InputStream《字节流》转换为Reader《字符流》,提高读取效率.【这个地方说是提高效率,字节流不也有他们的装饰类吗?难道那个不可以吗?】
    4、我的疑惑是,我感觉我们操作的都是字节流,用字符流没必要,除了我们在读写是指定码表去保存或者读取文件。或者在程序中指定写入的是字符串。虽然我们第一感觉就知道这个流用什么操作,例如硬盘上的图片或者视频我们用字节,记事本文件用字符。


作者: 云惟桉    时间: 2012-5-10 01:29
其实我觉得字符流也有字符流的好处吧。它处理起来相对于程序员来说更直观一些。
另外,在编码表不同的情况下,字符占的字节数应该也有所区别,
这时我们使用字节流就需要考虑内容存取的可分割性,比如是取两个字节表示一个字符,还是三个或四个,这个情况都有所变化。
当然,这也许是面向国际语言开发时候才需要的考虑的了。

还有一个例子就是,我们在使用文本框输入的时候,就需要记录上一步的输入状态,
我想会涉及到字符回退的问题,这时用字符读取和回退,以我们更容易明白的字符为单位,应该比用字节读取和回退要方便一些吧。

以上是个人理解,希望能互相交流学习。
作者: 黑马-王建雨    时间: 2012-5-10 01:32
同感。期待回答
作者: 黄坚声    时间: 2012-5-10 11:30
1推荐流是一个有序的字节序列,可作为一个输入源,也可作为一个输出的目的地。
字节流以字节为单位输入输出,字节流类名含有stream,字符流以字符为单位输入输出,字节流
类名含有reader或writer.为了通用性,java中字符是16位的unicode字符,所以8位的字节流必
须和16位的字符流进行转换。字节流到字符流的转换使用InputStreamReader类:
public InputStreamReader(InputStream in);
public InputStreamReader(InputStream in,String encoding);
public OuputStreamWriter(OnputStream in);
public OnputStreamWriter(OnputStream in,String encoding);
Reader和Writer类允许用户在程序中无缝的支持国际字符集,如果要读区的文件是别国语言,
要使用字符流。
JavaI/O字节流与字符流就是java 实现输入/输出 数据 字节流是一个字节一个字节的输入/输出 数据 (两个字节组成一个汉字)所以在用字节流读一串汉字时会出现乱码问题,
同样字符流是一个字符一个字符流(一个字符=两个字节)的输入/输出 数据 用字符流读一串汉字可以解决乱码问题.

作者: 黄坚声    时间: 2012-5-10 11:32
是否可以这样理解:

  纯文本文件,比如纯汉字。不用 Reader 而用 inputstream 也能正确读出,是否因为字节流每次都读 1 个字节,只是效率和方便性上相比 字符流 有不足 ?  

  字节流是不带编码信息的,需要知道原始的字节的字符集,才能转码过来,而reader不用转,2边字符集一致的话,直接就出来了。而图片之类是图片编码,不是字符编码,所以只能用字节流处理 ?

  字节流通吃,而字符流是处理具有某种编码格式的字符 ?


作者: 黄坚声    时间: 2012-5-10 11:35
挺简单的,也可以这样理解吧:

字节流是最基本的,所有的InputStream和OutputStream的子类都是字节流,其主要用于处理二进制数据,并按字节来处理。实际开发中很多的数据是文本,这就提出了字符流的概念。它按虚拟机的encode来处理,也就是要进行字符流的转化。这两者之间通过InputStreamReader和OutputStreamWriter来关联。实际上通过byte[]和String来关联在实际开发中出现的汉字问题,这都是在字符流和字节流之间转化不统一造成的。

   字节流转化为字符流,实际上就是byte[]转化为String。

   字符流转化为字节流,实际上就是String转化为byte[]。

    至于java.io中还出现了许多其他的流,主要是为了提高性能和使用方便,如BufferedInputStream、PipedInputStream等。





作者: 黄坚声    时间: 2012-5-10 11:36
我的以上几个回答,希望你满意!谢谢!
作者: 何阳    时间: 2012-5-10 14:52
黄坚声 发表于 2012-5-10 11:36
我的以上几个回答,希望你满意!谢谢!

虽然我们看的是纯文本,但实质是字节,这个怎么解释,以前只有字节流,没有字符流怎么办?




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