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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邵中国 中级黑马   /  2012-4-26 15:47  /  2562 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package cn.itcast.t08;
/*需求:
* 编写程序,拷贝一个带内容的文件夹。*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.junit.Test;
public class Copy {
@Test
public void test(){
  File sourFile = null;
  File desFile = null;
  String sourFolder = "d:/jjj";
  String desFolder = "e:/copyTest";  
  sourFile = new File(sourFolder);
  if (!sourFile.isDirectory() || !sourFile.exists()) {
   System.out.println("文件夹不存在");
  }
  desFile = new File(desFolder);
  desFile.mkdir();
  copy(sourFile.listFiles(), desFile);
}
private static void copy(File[] s, File d) {
  if (!d.exists())
   d.mkdir();
    for (int i = 0; i < s.length; i++) {
   if (s[i].isFile()) {
    try {
     FileInputStream fis = new FileInputStream(s[i]);
     FileOutputStream fos = new FileOutputStream(new File(
       d.getPath() + File.separator + s[i].getName()));
     int len=0;
        byte[] data = new byte[1024];
     if ((len=fis.read(data)) != -1) {
      fos.write(data);
     }
     fos.close();
     fis.close();
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
   if (s[i].isDirectory()) {
        File des = new File(d.getPath() + File.separator
      + s[i].getName());
    des.mkdir();
    copy(s[i].listFiles(), des);
   }
  }
}
}


复制后和原来的文件夹大小不一样了,怎么回事

5 个回复

倒序浏览
大哥,我要怎么说你好呢,
  1. if ((len=fis.read(data)) != -1) {
  2.       fos.write(data);
  3.      }
复制代码
if->while then ok!
回复 使用道具 举报
另外fos.write(data);最好改成fos.write(data,0,len);
回复 使用道具 举报
楼上正解;
1.拷贝语句得循环使用,得把if改while;
2、你用缓冲数组读1024个字节,write方法要用write(buf,o,len)不然你拷贝的文件总会比原文件多点,因为你都1k的拷,原文件没这么正好是1024的倍数;
回复 使用道具 举报
拷贝必须用while或者for循环,if的话只拷贝一次
还有你用数组拷贝的话,还要加上长度,fos.write(data,0,len);
加了长度,数组里放了多少元素才拷多少元素,
除非你文件大小正好是1024的整数倍,要不然大小都会不一样
回复 使用道具 举报
If该while就不说了,
我说说第二条举个例子:假如文件大小为3000(不到3*1024)k,那你考文件是一次拷1024k个字节需要拷三次,前两次都是正好1024k在最后一次源文件只剩下952k了,最后一次拷到目标文件里还是1024k,所以就会大点,解决方法已有就不说了。
其实有个available()方法可以定义正好的缓冲区数组,但这个要慎用,因为如果源文件过大就会内存溢出
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马