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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

为什么用字符流复制的图片打不开,而用字节流复制的却可以打开?我知道字符流要牵涉到编码,我猜这应该也与编码有关。但具体是怎么导致的呢?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

8 个回复

倒序浏览
字节流是用八位的字节直接代表图片进行转换。我们来说说字符流。
字符流在复制图片的时候,有一些代码能在编码表中找到编码,就转换成编码,但是还有好多找不到的代码,
JVM就会用一些类似的编码代替,文件就会改变了,所以打不开

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
你用字符流复制非纯文本的文件,都是不行的,因为用字符流复制的时候,他会按照你系统的字符码表进行查找和替换,把二进制数据全部按照码表替换了,你再打开肯定不是图片了,老师说的很清楚,非纯文本不要用字符流。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
字节流是读取的是字节,也就是机器存储时的源码,任何软件在计算机中存储的形式都是二进制,所以说,字节可以读取任何软件,而字符只是针对某个字,而且容易出现乱码,,而字节流就不会。
回复 使用道具 举报
本帖最后由 隋营营 于 2012-5-7 11:35 编辑

这是编码、解码的问题:

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

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

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
因为图片文件是属于二进制格式的文件,

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