黑马程序员技术交流社区

标题: io流复制一个图片,但复制完的比原文件小一点,打不开 [打印本页]

作者: 孙茜茜    时间: 2013-6-27 16:30
标题: io流复制一个图片,但复制完的比原文件小一点,打不开
本帖最后由 孙百鑫 于 2013-6-30 08:43 编辑
  1. class Test1
  2. {
  3.         public static void main(String[] a)throws IOException
  4.         {
  5.                 BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("D:\\javafile\\day19\\src\\a.jpg")));
  6.                 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\javafile\\day19\\src\\b.jpg")));
  7.                 String s=null;
  8.                 while((s=br.readLine())!=null)
  9.                 {
  10.                         System.out.println(s);
  11.                         bw.write(s);
  12.                 }
  13.                 br.close();
  14.                 bw.close();
  15.         }
  16. }
复制代码
比如35k的图a,复制了图b却只有32k,打不开

作者: 神之梦    时间: 2013-6-27 16:44
图片你也用字符流来转?
作者: 花伟昌    时间: 2013-6-27 16:46
你的IO流操作有错误,图片要使用字节流操作,纯文本数据才可以使用这符流。
如下:
作者: 花伟昌    时间: 2013-6-27 16:46
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

class Test1

{

        public static void main(String[] a)throws IOException

        {

                BufferedInputStream bis=new BufferedInputStream(new FileInputStream("D:\\a.jpg"));

                BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("D:\\b.jpg"));
                int len=0;
               
                while((len=bis.read())!=-1)

                {

                       
                        bos.write(len);

                }

               bis.close();

               bos.close();

        }

}

作者: 刘渝灵    时间: 2013-6-27 16:47
我正有个疑问,字节类型的文件能否用字符流来复制,你这个例子就来了,我还没试过。
不过你这个读取的方法有问题吧?字节文件能读一行吗?一个一个字符的读还有点可能吧
作者: 孙茜茜    时间: 2013-6-27 16:57
刘渝灵 发表于 2013-6-27 16:47
我正有个疑问,字节类型的文件能否用字符流来复制,你这个例子就来了,我还没试过。
不过你这个读取的方法 ...

一行一行和一个一个我都试过,挂了,前面同学说的对,不能用字符流,改成字节流就对了。
我用InputStreamReader把字节流转换成字符流是因为学到这了没分清楚,以为想转就能转呢。
作者: 刘渝灵    时间: 2013-6-27 17:09
我试了下还是不行,也许确实不行。字节数据在编码解码的过程中,安照编码表有些字节可能根本没有对应的码值而用其他的码值替代了,这样一来数据就不准确了。可是为什么我复制出来的文件比原来的还大呢
作者: zms2100    时间: 2013-6-27 17:21
孙茜茜 发表于 2013-6-27 16:57
一行一行和一个一个我都试过,挂了,前面同学说的对,不能用字符流,改成字节流就对了。
我用InputStream ...

1、图片是没有换行符的嘛,另外读取到的数据是会删掉换行符的字节/字符数据,也就会将读到符合换行符的字节数据丢失;
2、用字符流读取一般字节数据,因为是双字节操作,所以过程难免会发生错误(这个一下子想不到例子)。
3、说下转换流的使用吧,个人理解:   
说白了,转换流就是字符流读取字节文件的基石,转换流(InputStreamReader等)是文件字符流(FileReader等)的父类,读取字符文件数据底层应该还是字节流,只不过通过转换流(起到装饰转换作用)将读取到的数据转换成字符数据,可给其他字符流操作(文件字符流也就是封装两个功能的流类而已)。
这应该可以帮助你理解转换流的使用,带有很重的个人理解,呵呵,仅供参考,帮助理解而已。
作者: 孙百鑫    时间: 2013-6-30 08:43
楼主您好,帖子长时间没有动态我已经将您的帖子改成已解决。如有问题请私密我哦~




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