黑马程序员技术交流社区

标题: 请问这个题目这么写可以吗? [打印本页]

作者: 逍遥呆    时间: 2014-9-12 21:46
标题: 请问这个题目这么写可以吗?
本帖最后由 逍遥呆 于 2014-9-12 21:48 编辑

使用带缓冲功能的字节流复制文件
  1. import java.io.*;
  2. /*
  3.   第六题:使用带缓冲功能的字节流复制文件。
  4. */
  5. public class Text6 {

  6.         public static void main(String[] args)//throws IOException
  7.         {
  8.                 //创建读取流对象
  9.                 FileInputStream fis = null;
  10.                 InputStreamReader isr = null;
  11.                 BufferedReader bur = null;
  12.                 //创建写入流对象
  13.                 FileOutputStream fos =null;
  14.                 OutputStreamWriter osw =null;
  15.                 BufferedWriter buw =null;
  16.                 try//对读取流及写入流运行中产生的异常进行处理
  17.                 {
  18.                         //将读取流对象和文件相关联
  19.                         fis = new FileInputStream("e:\\abc\\1.txt");
  20.                         //将字节流转成字符流再使用字符流缓冲区的方法
  21.                         isr = new InputStreamReader(fis);
  22.                         //为提高效率将字符串进行缓冲区技术高效操作
  23.                         bur = new BufferedReader(isr);
  24.                         
  25.                         //将写入流对象和文件相关联
  26.                         fos = new FileOutputStream("e:\\abc\\2.txt");
  27.                         //将字符流转成字节流
  28.                         osw = new OutputStreamWriter(fos);
  29.                         buw = new BufferedWriter(osw);

  30.                         String s = null;
  31.                         while ((s=bur.readLine())!= null)//将读取流中的一行数据赋给s
  32.                         {
  33.                                 buw.write(s);                                //将s中的数据放到写入流中
  34.                                 buw.newLine();                                //换行操作
  35.                                 buw.flush();                                //将写入流数据刷入到文件中
  36.                         }
  37.                 }
  38.                 catch(IOException e)
  39.                 {
  40.                         throw new RuntimeException("文件复制失败!");
  41.                 }
  42.                 finally//关闭读取流及写入流,并对读取流及写入流异常进行处理
  43.                 {
  44.                         try
  45.                         {
  46.                                 if(bur!=null)
  47.                                         bur.close();//关闭读取流
  48.                         }
  49.                         catch(IOException e1)
  50.                         {
  51.                                 throw new RuntimeException("读取流关闭失败!");
  52.                         }
  53.                         try
  54.                         {
  55.                                 if(buw!=null)
  56.                                         buw.close();//关闭写入流
  57.                         }
  58.                         catch(IOException e2)
  59.                         {
  60.                                 throw new RuntimeException("写入流关闭失败!");
  61.                         }
  62.                 }
  63.                
  64.                
  65.                
  66.                
  67.         }
  68. }
复制代码
可是复制的txt内容一样,但是两个不一样大,复制的图片不能打开。请问到底是什么问题?



作者: 逍遥呆    时间: 2014-9-12 21:47
可是复制的txt内容一样,但是两个不一样大,复制的图片不能打开。请问到底是什么问题?
作者: Fightin黑马    时间: 2014-9-12 22:03
这个只能用来复制文本文件,不能复制其他文件,否则会乱码,因为你用的是字符流 Writer和Reader 都是字符流
作者: fantacyleo    时间: 2014-9-12 22:13
楼上正解。另外你的文本文件复制后大小有变化可能是因为多余的newline。比如说,源文件有3行,第3行结束后没有换行符。但是按你的程序输出时,write了第三行的数据后还会跟上一个换行符,导致大小不一致
作者: 逍遥呆    时间: 2014-9-12 22:22
Fightin黑马 发表于 2014-9-12 22:03
这个只能用来复制文本文件,不能复制其他文件,否则会乱码,因为你用的是字符流 Writer和Reader 都是字符流 ...

那这样解答这道题对吗?可是文本复制大小也不一样的,这是怎么回事?
作者: 逍遥呆    时间: 2014-9-12 22:23
fantacyleo 发表于 2014-9-12 22:13
楼上正解。另外你的文本文件复制后大小有变化可能是因为多余的newline。比如说,源文件有3行,第3行结束后 ...

谢谢,这个我明白了,因为正好差两字节。那这样解答这道题行吗?
作者: fantacyleo    时间: 2014-9-12 22:53
逍遥呆 发表于 2014-9-12 22:23
谢谢,这个我明白了,因为正好差两字节。那这样解答这道题行吗?

保险起见,当然是要做到一致。毕竟视频里强调过复制完成后比较字节数的
作者: 逍遥呆    时间: 2014-9-12 23:19
fantacyleo 发表于 2014-9-12 22:53
保险起见,当然是要做到一致。毕竟视频里强调过复制完成后比较字节数的 ...

那这要怎么改呢?能否指点下?
作者: MeryStyle    时间: 2014-9-12 23:45
lz用字符流怎么能复制图片呢??图片文件都是二进制数据,复制他们要用字节流。怎么改,,,考虑用下bufferedInputStream,BufferedOutputStream和FileInputStream,FileOutputStream吧!应该可以的。
作者: 逍遥呆    时间: 2014-9-12 23:49
MeryStyle 发表于 2014-9-12 23:45
lz用字符流怎么能复制图片呢??图片文件都是二进制数据,复制他们要用字节流。怎么改,,,考虑用下buffer ...

那这个题目这么写是可以的吗?这里的文件是指的什么呢?
作者: fantacyleo    时间: 2014-9-12 23:57
逍遥呆 发表于 2014-9-12 23:19
那这要怎么改呢?能否指点下?

先读一行,如果非空就write写入。然后写while循环,循环体内先换行再write
作者: 逍遥呆    时间: 2014-9-13 00:30
fantacyleo 发表于 2014-9-12 23:57
先读一行,如果非空就write写入。然后写while循环,循环体内先换行再write

明白了,谢谢
作者: 苏乞儿    时间: 2014-9-13 00:39
楼主眼睛真毒,我试了好几次都没发现,受教了,,保险起见,那就不用newLine了吧,直接上字节流定义字节数组得了
作者: MeryStyle    时间: 2014-9-13 18:45
逍遥呆 发表于 2014-9-12 23:49
那这个题目这么写是可以的吗?这里的文件是指的什么呢?

如果复制的是文本文件当然是可以的,但是当复制的是二进制文件时,如:图片视频等,那就会出问题了。如果使用字节流的方式复制,这里的文件即可以是二进制文件也可以是文本文件;但如果使用的是字符流的方式,文件只能是文本文件了;也就是说,对于二进制我文件只能通过字节流操作。
作者: 逍遥呆    时间: 2014-9-13 20:06
MeryStyle 发表于 2014-9-13 18:45
如果复制的是文本文件当然是可以的,但是当复制的是二进制文件时,如:图片视频等,那就会出问题了。如果 ...

谢谢,明白了




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