2 b703229670 b703229670 于 2016.03.29 08:38 提问

字节流复制图片的问题,报错,复制失败,图片损坏而且为0 kb

import java.io.*;
class Lee{
public static void main (String[] args){
FileOutputStream fos=null;
FileInputStream fis=null;
try{
fos=new FileOutputStream("D:\毕向东视频\9.png");
fis=new FileInputStream("D:\毕向东视频\99.png");
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("读取失败");
            }
        }
    }
}

5个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.03.29 09:56
已采纳

首先,你的文件路径有问题,编译出错,尽量使用/这个而不是反斜杠\,因为反斜杠是转义字符。
其次,在你的异常分支打印堆栈信息,便于排错。throw new RuntimeException("复制失败");这句话抛出之前先打印e.printStackTrace();

b703229670
b703229670 谢大神指导
一年多之前 回复
b703229670
b703229670   2016.03.29 08:40

急求大神指点,谢谢了

danielinbiti
danielinbiti   Ds   Rxr 2016.03.29 09:33
 这路径写法编译不报错?应该得2个\
 fos=new FileOutputStream("D:\\毕向东视频\\9.png");
fis=new FileInputStream("D:\\毕向东视频\\99.png");
b703229670
b703229670 我记得,我修改过双斜杠的,报错了,回家再试试上面大神的
一年多之前 回复
qq_27394395
qq_27394395   2016.03.29 09:41

不要写绝对路径,而且路径中最好不要带中文,复制的话 我建议字节流,因为字符流 一次读两个字节,有可能碰到结尾是单字节 就会出错!

b703229670
b703229670 好的,已解决,谢大神指导
一年多之前 回复
wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.03.29 10:00

补充一下,你检查下图片的大小,如果超过1M,那么你使用1024字节的缓冲区就可能使文件受损的。
修正代码如下:

 class Lee {
    public static void main(String[] args) {
        FileOutputStream fos = null;
        FileInputStream fis = null;
        try {
            fos = new FileOutputStream("D:/copy.jpg");
            fis = new FileInputStream("D:/照片打印/picture2.jpg");
            byte[] buf = new byte[2048];
            int len = 0;
            while ((len = fis.read(buf)) != -1) {
                fos.write(buf, 0, len);
            }
            fos.flush();
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("复制失败");
        } finally {
            try {
                if (fis != null)
                    fis.close();
                fos.close();
            } catch (IOException e) {
                throw new RuntimeException("读取失败");
            }
        }
    }
}
b703229670
b703229670 谢谢大神指导已解决
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!