public class ImageCopy { /**
 * @param args
 */
public static void main(String[] args) {
FileInputStream fio =null;
FileOutputStream fos = null;
 try {
fio = new FileInputStream("e:\\s.jpg");
fos = new FileOutputStream("d:\\w.jpg");
byte temp[] = new byte[1024];//缓存
//循环读取
int n=0;//记录实际读取到的字节数,实际读取了几个字节
while((n=fio.read())!=-1){
//输出到指定文件

fos.write(temp);
}
} catch (FileNotFoundException e) {
 
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
fio.close();
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 
}
}}输出的这个 w.jpg 有10.8 MB 而原始文件s.jpg 是10.8KB
而且用acdsee打开的时候,图片是啥都没有的,“ 原始数据格式无法识别”。 

解决方案 »

  1.   

     while((n=fio.read())!=-1)改成while((n=fio.read(temp))!=-1)每次读出来的东西要放进去哈!
      

  2.   

    fio.read()是只读一个字节,每读一个后,你写了1024个字节(temp).肯定文件会大,而且temp中根本就没有原文件的数据。使用n=fio.read(temp)会将源文件的数据流放到temp中,但是要注意不一定放满,比如源文件只有500个字节,你执行fos.write(temp)时还是写出1024个字节。这个时候n(实际读取的字节数)就有用了。使用fos.write(temp, n);不知道有没有这个方法,应该有吧。作用就是只写temp中的前n个字节。整体流程就是读数据到temp中,并知道具体读了多少个字节,然后将temp写到输出文件中,也要指定写多少个字节。
      

  3.   

    谢了哈,搞定了while((n=fio.read(temp))!=-1){
    //输出到指定文件

    //fos.write(temp);
    fos.write(temp, 0, n);
    }换成这个OK