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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 绿树林 中级黑马   /  2013-4-16 12:48  /  1987 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭华章 于 2013-4-17 10:58 编辑

我利用以下方式复制图片,为何却失败呢?
                BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("pic.jpg")));
                BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("copy_pic.jpg")));

                String readStr=null;
                while((readStr=br.readLine())!=null){
                        bw.write(readStr);
                }
                br.close();
                bw.close();

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

10 个回复

倒序浏览
使用字符缓冲区要刷新,你试一下,可以不、。
回复 使用道具 举报
我十分不明白你为什么要用转化流去复制一个图片。 你没有理解转换流的用法,所以你才会导致在复制一个二进制文件的时候去使用转化流。

你上边相当于完成了这么一个事情。
字节--》字符--》---》字节,,哥们不累啊。


什么时候用到转换流呢,比如说system.in
因为在你键盘录入的时候,你写入的肯定是字符吧,不可能从键盘上录入二进制数去。。
这是,为了你操作方便,才使用转换流,也就是在确保你录入的信息是字符信息,而你对应的流是一个字节流。
这时候,才需要转换,是为了操作方便,比如说使用br.readLine()去一下子将键盘录入的信息从它的字节流中得到一个对应的字符串 ,这中间一定有编码和解码。



至于copy图片文件,使用BufferedOutputStream和BufferedInputstream完全就可以了
例子:

BufferedInputStream br=new BufferedInputStream(new FileInputStream("0.png"));
        BufferedOutputStream bw=new BufferedOutputStream(new FileOutputStream("copy_pic.png"));

        byte []bytes = new byte[1024];
        int len = 0;
        while((len=br.read(bytes))!=-1){
                bw.write(bytes,0,len);
        }
        br.close();
        bw.close();

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
你要是能把图片复制了,你就是大神了。
我想说你可能连(BufferedWriter (BufferedReader的具体功能都没搞清楚啊!
他们是专门用来处理字符的缓冲区,你这是图片,所以要用字节流File来操作了,其实老师有课程的
import java.io.*;
class CopyPic
{
        public static void main(String[] args)
        {
                FileOutputStream fos=null;
                FileInputStream fis=null;
                try
                {
                        fos=new FileOutputStream("e:\\Desert_copy.jpg");
                        fis=new FileInputStream("e:\\Desert.jpg");
                        byte[] buf=new byte[1024];
                        int len=0;
                        while((len=fis.read(buf))!=-1)
                        {
                                fos.write(buf,0,len);
                        }
                }
                catch (IOException e)
                {
                        throw new RuntimeException("复制文件失败");
                }
                finally
                {
                        try
                        {
                                if(fis!=null)
                                        fis.close();
                        }
                        catch (IOException e)
                        {
                                throw new RuntimeException("读取关闭失败");
                        }

                        try
                        {
                                if(fos!=null)
                                        fos.close();
                        }
                        catch (IOException e)
                        {
                                throw new RuntimeException("写入关闭失败");
                        }
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
我只是在测试某些类的功能,不是为了实现一件事情而非这样写不可的,各位看官可能误解了吧,既然InputStreamReader能把字节流处理成字符流,而OutputStreamWriter 又是字符流通向字节流的桥梁,这种写法有何不妥?
回复 使用道具 举报
郭华章 发表于 2013-4-16 13:34
我只是在测试某些类的功能,不是为了实现一件事情而非这样写不可的,各位看官可能误解了吧,既然InputStrea ...

我们并没有理解错
转换流的把读入的时候 是 字节到字符的,但是你这是图片用转换流这样处理显然不对,至于为什么我现在还不是很明白。一般也不这样搞?这是简单问题复杂化
回复 使用道具 举报
偏執旳、靑春 发表于 2013-4-16 13:47
我们并没有理解错
转换流的把读入的时候 是 字节到字符的,但是你这是图片用转换流这样处理显然不对,至 ...

如果为了处理问题,肯定是不会把简单问题复杂化,但是测试类的方法的时候,就不用考虑了吧
回复 使用道具 举报
复制图片,你应该用字节流,只要在操作字符的时候用字符流,复制图片的参考代码为:
BufferedInputStream bufi=new BufferedInputStream(new FileInputStream("pic.jpg"));
BufferedOuputStream bufo=new BufferedOutputStream(new FileOutputStream("Pic2.jpg));
byte[] buf=new byte[1024];
int len=0;
while((len=bufe.read(buf))!=-1)
{
     bufo.write(buf,0,len);
     bufo.flush();
}
bufo.close();
bufi.close();
此代码没有进行异常的处理。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
Alan 中级黑马 2013-4-16 14:24:40
9#
你好 楼主 将代码改成如下是可以复制的 但是字节流 经过转换流转换后  由于编码问题 复制的图片是不能打开
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("pic.jpg")));
                BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("copy_pic.jpg")));

                String readStr=null;
                while((readStr=br.readLine())!=null){
                        bw.write(readStr);
bufo.flush();

                }
                br.close();
                bw.close();

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
再次回答楼主。
为什么你的不能。

比如,我使用了GBK编码格式去将图片中的字节转成了相应的字符。
但是总有一些字节转不成字符。它就转成了形如��的字符符号。这是编码表中对于未知字符的标识。
比如我的字节为10101010转成了�,还有一个字节11111111转成了�,
当你再次使用OutputStreamWriter的时候,系统就不知道�到底是对应哪个字节了,是10101010?还是11111111?
所以就使编码出错。
图片也就打不开了,很正常,
楼主你何必这样玩呢,没意思

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马