黑马程序员技术交流社区

标题: 关于 字符流为什么不能操作图片的问题?????? [打印本页]

作者: awkflf11    时间: 2014-3-25 22:54
标题: 关于 字符流为什么不能操作图片的问题??????
  

        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();
        }

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

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



作者: yanzhendong    时间: 2014-3-25 23:16
图片数据中可能包含-1,因为图片数据时字节数据其值从-128到+127,而字符流是字符数据,其值从0到127,用字符流读图片数据可能会读到-1并把-1当成结束标记
作者: 郭黎明    时间: 2014-3-25 23:29
字符流的底层操作的也是字节,但是它又牵扯到编码解码的问题,如果用来操作图片或者音频文件,会出现乱码现象,会无法正常打开
作者: 何伟超    时间: 2014-3-26 00:07
因为图片是字节码组成的!
作者: tcny    时间: 2014-3-26 00:45
你琢磨琢磨,字符是什么,与图片有关系吗?
作者: xuehuayous    时间: 2014-3-26 08:19
首先字符流可以在内部融合编码表而字符流基于字节流。
如果你用字节流复制图片,复制完的图片有可能打开看不了,还有可能都打不开。因为图片数据读一段然后去查表,到编码表找到对应的的数字,如果找到了对应的数字,编码未变;如果没找到对应的数字,那么走的是编码表的未知数据区域,那么编码就变化了,所以生成新图片的编码和老图片是不一样的。
所以字符流只能操作文本文件。希望对你有帮助!
作者: 王竞    时间: 2014-3-26 10:14
文字使用编码来完成的,比如ascii码。我们所看到的文字都是通过编码的,比如我们常用的utf-8、gbk、iso8859-1,现在的显示技术都是使用的矢量的方式来显示的,不是以前的那种矩阵的方式。矢量的好处就是可以无限的放大,文字并不会变形,因为他是通过数学公式计算出来的。而图像就是0和1的二进制表示的。               编码:比如-128~127这里面的就可以包含英文了,因为英文只有26个字母,那我们用这个区间来装我们的汉子,肯定就不够用了吧,所以汉子使用2个字节来表示的。当然这个在不同的编码中所占用的大小事不同的,你应该在学毕老师的视频,毕老师的视频中有讲到编码的,好好学习下吧
作者: awkflf11    时间: 2014-3-26 12:17
郭黎明 发表于 2014-3-25 23:29
字符流的底层操作的也是字节,但是它又牵扯到编码解码的问题,如果用来操作图片或者音频文件,会出现乱码现 ...

谢谢   回答   
作者: MVP    时间: 2014-3-26 18:09
正确来说,是可以操作,但是出现打不开的现象。因为字符流最底层的操作是操作字符的,是根据编码来写的,字符流处理的单元为2个字节的Unicode字符,所以处理图片会出现乱码。而字节流是一个一个字符读取的,所以操作任何文件数据可以。
作者: ithmC4    时间: 2014-3-26 18:15
字符流会查码表,码表里边是不会出现-1的,所以用-1来作为文件读取完毕的标志。
而图片文件等二进制文件会出现-1,当读取中途读到你写的这个循环会停止。           
  1.                 while((by=fis.read())!=-1)
  2.                         fos.write(by)
  3.                 }
复制代码


               




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