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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 田建 高级黑马   /  2012-6-9 09:15  /  1648 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 田建 于 2012-6-9 16:21 编辑
  1. import java.io.*;
  2. class FileStreamCopy
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 fileStreamCopy();
  7.         }
  8.         public static void fileStreamCopy()
  9.         {        
  10.                 FileInputStream fis=null;
  11.                 FileOutputStream fos=null;
  12.                 try
  13.                 {
  14.                         fis=new FileInputStream("party.jpg");
  15.                         fos=new FileOutputStream("copy.jpg");
  16.                         byte[] by=new byte[1024];
  17.                         int len=0;
  18.                         while((len=fis.read(by))!=-1)//我在第一遍写的时候,将by写掉了,然后发现程序无法停止,并且所拷贝的文件的大小无限制的增大,请问为什么会这样,并且没有数组,它的数据是写到哪里去了?
  19.                         {
  20.                                 fos.write(by,0,len);
  21.                         }
  22.                 }
  23.                 catch(IOException e)
  24.                 {
  25.                         throw new RuntimeException("读写失败");
  26.                 }
  27.                 finally
  28.                 {
  29.                         try
  30.                         {
  31.                                 if(fis!=null)
  32.                                 fis.close();
  33.                         }
  34.                         catch(IOException ex)
  35.                         {
  36.                                 throw new RuntimeException("关闭读取流失败");
  37.                         }
  38.                         try
  39.                         {
  40.                                 if(fos!=null)
  41.                                 fos.close();
  42.                         }
  43.                         catch(IOException ex)
  44.                         {
  45.                                 throw new RuntimeException("关闭写入流失败");
  46.                         }
  47.                 }
  48.         }
  49. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
我第一次拷贝的是一个1k的小文件,我这边压根就没有死循环,只是拷贝了一个“空文件”,发现里面全是空格;而已;第二次我将打印fis.read()打印,拷贝一个300M的文件,出现了你说的那种情况,并且不断打印出
48
48
48
44
49
52
56
53
51
57
52
48
48
48
48
48
48
48
48
48
48
48
44
49
52
56
53
51
57
50
48
48
48
48
48
48
48
48
48
48
48
44
49
52
56
53
51
但是我判断,他肯定也会结束。只不过是要非常大。后又经几次不同大小文件的测试,近一步确定了我的判断,楼主肯定是大文件读写。估计程序是将内存中扑捉的任意一段字节流长度写到了文件中,但为什么不是文字或乱码,而是空格,我就不清楚了。不过这种非正常操作,很难分析,期待他人答复。
回复 使用道具 举报
武剑峰 发表于 2012-6-9 09:38
我第一次拷贝的是一个1k的小文件,我这边压根就没有死循环,只是拷贝了一个“空文件”,发现里面全是空格; ...

没有太大,只是2M,没多久就到了大几百M了,还在继续涨,我就ctrl+c了!
回复 使用道具 举报
先看下JDK里面read()的返回值类型len
public abstract int read()
                  throws IOException从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。
子类必须提供此方法的一个实现。


返回:
下一个数据字节;如果到达流的末尾,则返回 -1。
抛出:
IOException - 如果发生 I/O 错误。
再看下你读一个字节写入的是什么东西
  while((len=fis.read())!=-1)
      fos.write(by,0,len);
知道为什么了吧?by里面根本都没内容呢,你读一个字节写一个从0到255都有可能的空字符数组,看明白没有?
回复 使用道具 举报
本帖最后由 田建 于 2012-6-9 10:49 编辑
黄奕豪 发表于 2012-6-9 09:50
先看下JDK里面read()的返回值类型len
public abstract int read()
                  throws IOException从 ...


哟西,了解!!{:soso_e144:}
回复 使用道具 举报
FileInputStream里的read()方法从此输入流中读取一个数据字节。如果没有输入可用,则此方法将阻塞。
  1. while((len=fis.read())!=-1)//去掉by之后,by里面一直都是空的,放的是默认值0。
  2.                     {
  3.                             System.out.println(len);
  4.                             fos.write(by,0,len);//by里全部由是0,假如这次读到的是字母a,那len就是97,那么这里就把by里0到96的数据写到文件,但可惜的是by里全部都是0,表示空格,这里会写97个空格到文件里,所以最后文件里会有很多空格。
  5.                     }
复制代码
回复 使用道具 举报
武剑峰 来自手机 中级黑马 2012-6-9 11:30:16
7#
牛人,学习了
来自:黑马程序员训练营论坛 Android客户端来自: Android客户端
回复 使用道具 举报
这是因为read()方法里没有添加容器(也就是所谓的buf 字节数组;)每一次都会返回一个0-255之间的数,所以fos.write(by,0,len);的实际执行内容就变成了把buf数组中0到len角标的元素写放了你的目标文件,因此你的目标文件(也就是所谓的copy文件)会比原文件大很多,但也不是无限增大;最大不会超过原文件的255倍;所以程序会停的。不没有死循环的说法;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马