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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  

        public static void copyPic3() throws IOException {
               
                FileInputStream fis = new FileInputStream("temp\\0.bmp");               
                FileOutputStream fos = new FileOutputStream("temp\\3.bmp");
                     
                FileReader fis = new FileReader("temp\\0.bmp");//  图片文件               
                FileWriter fos = new FileWriter("temp\\1.bmp");//  图片文件
//在这一步骤,,,,,为什么不能用字符流来复制图片,,,

                int by = 0;               
                while((by=fis.read())!=-1)
                        fos.write(by)
                }
               
                fos.close();
                fis.close();
        }

请问以上步骤,,为什么不能用字符流》》》,,,

如果不可以,,为什么可以用字节流?????  
多谢了,,,


评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

9 个回复

倒序浏览
图片数据中可能包含-1,因为图片数据时字节数据其值从-128到+127,而字符流是字符数据,其值从0到127,用字符流读图片数据可能会读到-1并把-1当成结束标记

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
字符流的底层操作的也是字节,但是它又牵扯到编码解码的问题,如果用来操作图片或者音频文件,会出现乱码现象,会无法正常打开
回复 使用道具 举报
因为图片是字节码组成的!
回复 使用道具 举报
你琢磨琢磨,字符是什么,与图片有关系吗?
回复 使用道具 举报
首先字符流可以在内部融合编码表而字符流基于字节流。
如果你用字节流复制图片,复制完的图片有可能打开看不了,还有可能都打不开。因为图片数据读一段然后去查表,到编码表找到对应的的数字,如果找到了对应的数字,编码未变;如果没找到对应的数字,那么走的是编码表的未知数据区域,那么编码就变化了,所以生成新图片的编码和老图片是不一样的。
所以字符流只能操作文本文件。希望对你有帮助!

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
王竞 中级黑马 2014-3-26 10:14:11
7#
文字使用编码来完成的,比如ascii码。我们所看到的文字都是通过编码的,比如我们常用的utf-8、gbk、iso8859-1,现在的显示技术都是使用的矢量的方式来显示的,不是以前的那种矩阵的方式。矢量的好处就是可以无限的放大,文字并不会变形,因为他是通过数学公式计算出来的。而图像就是0和1的二进制表示的。               编码:比如-128~127这里面的就可以包含英文了,因为英文只有26个字母,那我们用这个区间来装我们的汉子,肯定就不够用了吧,所以汉子使用2个字节来表示的。当然这个在不同的编码中所占用的大小事不同的,你应该在学毕老师的视频,毕老师的视频中有讲到编码的,好好学习下吧

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
郭黎明 发表于 2014-3-25 23:29
字符流的底层操作的也是字节,但是它又牵扯到编码解码的问题,如果用来操作图片或者音频文件,会出现乱码现 ...

谢谢   回答   
回复 使用道具 举报
MVP 中级黑马 2014-3-26 18:09:37
9#
正确来说,是可以操作,但是出现打不开的现象。因为字符流最底层的操作是操作字符的,是根据编码来写的,字符流处理的单元为2个字节的Unicode字符,所以处理图片会出现乱码。而字节流是一个一个字符读取的,所以操作任何文件数据可以。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
字符流会查码表,码表里边是不会出现-1的,所以用-1来作为文件读取完毕的标志。
而图片文件等二进制文件会出现-1,当读取中途读到你写的这个循环会停止。           
  1.                 while((by=fis.read())!=-1)
  2.                         fos.write(by)
  3.                 }
复制代码


               

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马