我想问下:在我用FileInputStream和FileOutputStream复制一个jpg文件的时候没有问题成功的执行了,也复制过去了,没有丢失,复制那个jpg文件大小为118KB。但我换用FileReader
和FileWriter做这个操作的时候也可以成功的执行复制操作,可是复制过去的jpg文件却小了,从118KB变成了108KB,图片也显示不了。请问下为什么?下面是我写是程序代码:
import java.io.*;
public class TestCopy {
public static void main(String[] args) {
int b = 0;
try {
//BufferedInputStream br = new BufferedInputStream(new FileInputStream("e://图片//010.jpg"));
//BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("f://TestCopy//000.jpg"));
BufferedReader br = new BufferedReader(new FileReader("e://图片//010.jpg"));
BufferedWriter bw = new BufferedWriter(new FileWriter("f://TestCopy//0012.jpg"));
/*while((b = br.read())!= -1) {
bw.write(b);
}*/
String s = null;
while(( s = br.readLine()) != null) {
 bw.write(s);
}
bw.flush();
br.close();
bw.close();
}catch(FileNotFoundException e1) {
System.out.println("未找到文件");
e1.printStackTrace();
}catch(IOException e2) {
System.out.println("复制错误");
e2.printStackTrace();
}
System.out.println("复制成功");
}
}

解决方案 »

  1.   

    inputstream和outputstream方式是一个字节一个字节复制。
    reader和writer是两个字节两个字节复制,主要用于文字,你要是用来传文件中间被截断了就肯定出错。
      

  2.   

    salaxun :
             您好!至于inputstream和outputstream,一个字节一个字节读和一个字节一个字节写,这个我清楚,reader和writer我也明白,但不明白的是您说的“你要是用来传文件中间被截断了就肯定出错”。
              我感觉无论是txt还是jpg应该都是一样的,无论是用inputstream和outputstream还是reader和writer都能很好的把文本文件复制,当然inputstream和outputstream不能复制中文,那么用reader和writer复制jpg的时候为什么就会出错呢,图片不也是由那些代码组成的吗? 那么用reader和writer复制,也能读,那为什么读不全呀 ? 一起读两个字节又怎么样呀? readLine()一读一行一直读到空为止,write(String s)这个方法也可写字符串,我就不明白为什么? 
              还有您说的“ 中间被截断了”是什么意思 ?
      

  3.   

    同上面几楼说的.
    FileReader和FileWriter其实主要作用是读取字符的,也就是普通文本用的,所以才是2个字节一读.
    感觉出错不在于5楼的描述,而是在FileReader和FileWriter读取2个字节之后会按照Unicode进行转码,最后读取的结果失去了原有的格式,jpg中的数据以2个字节为单位转码为Unicode字符,最后把字符写入了文件....当然就浮云咯...jpg就使用FileInputStream吧,或者用channel也行.很好奇如果FileWriter在写入之前把数据按Unicode还原,会不会就正常了.(当然,只是好奇,实际这么做是吃力不讨好)...
      

  4.   

    BufferedReader?
    你readLine之后的那个换行怎么不输出啊?
    bw.write(s); 
    bw.write("\n");这样也可能有问题,因为换行可能是 \n 也可能是 \r\n
    无法确定是哪个,所以用byte操作才是根本。