黑马程序员技术交流社区

标题: 为什么用字符流复制的图片打不开,而用字节流复制的却可以打开? [打印本页]

作者: 廖理    时间: 2012-5-7 11:15
标题: 为什么用字符流复制的图片打不开,而用字节流复制的却可以打开?
为什么用字符流复制的图片打不开,而用字节流复制的却可以打开?我知道字符流要牵涉到编码,我猜这应该也与编码有关。但具体是怎么导致的呢?
作者: 胡元    时间: 2012-5-7 11:21
字节流是用八位的字节直接代表图片进行转换。我们来说说字符流。
字符流在复制图片的时候,有一些代码能在编码表中找到编码,就转换成编码,但是还有好多找不到的代码,
JVM就会用一些类似的编码代替,文件就会改变了,所以打不开
作者: 周四川    时间: 2012-5-7 11:21
你用字符流复制非纯文本的文件,都是不行的,因为用字符流复制的时候,他会按照你系统的字符码表进行查找和替换,把二进制数据全部按照码表替换了,你再打开肯定不是图片了,老师说的很清楚,非纯文本不要用字符流。
作者: 郭振    时间: 2012-5-7 11:27
字节流是读取的是字节,也就是机器存储时的源码,任何软件在计算机中存储的形式都是二进制,所以说,字节可以读取任何软件,而字符只是针对某个字,而且容易出现乱码,,而字节流就不会。
作者: 隋营营    时间: 2012-5-7 11:31
本帖最后由 隋营营 于 2012-5-7 11:35 编辑

这是编码、解码的问题:

字符流按字符读数据:一次读两个字节,返回了这两个字节所对应的字符的int型数值(编码)。
写入文件时把这两个字节的内容解码成这个字符在Unicode码下对应的二进制数据写入。
即把原始文件中的二进制数据以字符形式读出,再将字符以二进制形式写入,所以得到的文件以字符方式存储。而图片的数据是按字节存储的,所以打开图片时解码出错了!

字节流按字节读数据:而字节不需要编码、解码,只有字节字符之间转换时才需要编码、解码!所以可以正常读取图片数据。

作者: 谭景宾    时间: 2012-5-7 11:31
因为图片文件是属于二进制格式的文件,

InputStream是字节流,一个字节的读,能正确处理二进制格式的文件
Reader是属于字符流,两个字节的读,不能正确处理二进制格式的文件
作者: 鹏少    时间: 2015-2-3 20:05
学习了顶顶顶顶顶
作者: gainn    时间: 2015-5-24 23:35
据网上搜到的帖子说的原因:一旦字符流检测到-1的二进制编码时,就会中断传输,舍弃后面的数据,字符型文件是不会有-1(二进制就是一长串11111111……)的编码的,而字节型文件就有可能包含长串全为1的数据,所以导致的用字符流复制字节文件会引起数据丢失……
作者: jlnu_wl    时间: 2015-6-28 15:31
用字符流在读取文件的时候,首先会遇到编码的问题,字符流在复制这些图片的时候,有一些代码能找到编码就转换成编码,但找不到的就出错了,而字节流是按照二进制读取写入文件,不涉及到编码问题,因此在非文本操作的时候我们都会使用字节流。




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