ufowumengfei 2016-12-08 11:11 采纳率: 100%
浏览 1925
已采纳

新手学java。利用java流实现文件夹的拷贝,可是拷贝结果文件全是零字节,求帮助

 package cn.java.io.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Demo09 {
    public static void dirsCopy(File srcPath,File destPath){
        File copyPath = destPath; 
        if(srcPath.isDirectory()){
            //如果是文件夹,则创建新的文件夹关联。此关联用于在目标文件夹下创建与源文件夹同名的文件夹目录
            copyPath = new File(destPath,srcPath.getName());
        }
        //在目标文件夹下创建与源文件夹同名的文件夹目录
        copyPath.mkdirs();
        try {
            //将文件夹内文件进行逐个拷贝
            fileDatilCopy(srcPath,copyPath);
        } catch (FileNotFoundException e) {
            System.out.println("文件不存在");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("文件读写失败");
            e.printStackTrace();
        }

    }

    private static void fileDatilCopy(File srcPath,File copyPath) throws FileNotFoundException, IOException {
        if(srcPath.isFile()){ //如果源文件是文件而非文件夹
            try {
                //调用fileCopy()方法对文件进行拷贝
                fileCopy(srcPath,copyPath);
            } catch (FileNotFoundException e) {
                System.out.println("文件不存在");
                e.printStackTrace();
            } catch (IOException e) {
                System.out.println("文件读写失败");
                e.printStackTrace();
            }
        }else if(srcPath.isDirectory()){//如果源文件夹是文件而非文件
            //确保目标文件夹存在
            copyPath.mkdirs();
            //获取下一级目录|文件
            for(File sub:srcPath.listFiles()){
                fileDatilCopy(sub,new File(copyPath,sub.getName()));
            }
        }
    }

    public  static void fileCopy(File srcPath,File srcCopy) throws FileNotFoundException,IOException  {
        //选择文件输入流 
        InputStream is = new FileInputStream(srcPath);
        //选择文件输出流
        OutputStream out = new FileOutputStream(srcCopy,true);
        byte[] by = new byte[100000];
        int len = 0;
        while(is.read(by)!= -1){
            //读多少写多少,防止资源浪费
            out.write(by,0,len);
        }
        //flush()方法强制刷出
        out.flush();
        //先打开后关闭原则,关闭流
        out.close();
        is.close();
    }

    public static void main(String[] args) {
        //原路径
        File srcPath  = new File("D:/myCode/temp");
        //指定路径
        File destPath = new File("D:/myCode/Temp_1");
        dirsCopy(srcPath,destPath);
    }
}

  • 写回答

3条回答 默认 最新

  • Readiay 2016-12-08 12:55
    关注

    你代码写的基本上没问题,就是一个小地方没有注意到
    图片说明

    你这里by数组获取到数据了,但是你执行write方法的时候,因为len总是0,所以总是把从0到0的这段by
    中值写到新的文件中,你需要这样改一下代码

    图片说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵