IO_字节流_节点流_文件夹拷贝_工具制作_文件后缀与软件的关系JAVA149、163

来源:http://www.bjsxt.com/
一、S02E149_01IO_字节流、节点流、文件夹拷贝、工具制作、文件后缀与软件的关系
1.文件夹拷贝
a.递归查找子孙级文件或文件夹
b.文件则直接复制(IO流复制);文件夹则创建
c.举例,A拷贝到AA

            A
          /   \
       a.txt   b
               |
             b.txt
拷贝
               AA
                | 
                A
              /   \
           a.txt   b
                   |
                 b.txt
(JAVA163)
d.解决:
不能将父目录拷贝到子目录中(解决方法:程序中if(des.getAbsolutePath().contains(src.getAbsolutePath())))
删除超长目录(源目录:G:/java/test/a,目标目录:G:/java/test/a/b,这样递归拷贝,目录超长,无法删除)
(解决方法:下载robocopy,解压后把robocopy.exe所在目录配置到环境变量中。在那个存在超长文件夹所在目录创建一个空目录t,然后格式如Robocopy /MIR storepath longlongpath,
例如robocopy /MIR G:\java\test\t G:\java\test\a,
其中上面的longlongpath指的是超长文件夹的文件夹。
在命令行运行,在一阵滚屏后,longlongpath被拷贝成t,也就是说变成一个空目录)
package com.test.io.stream;

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;
/**
 * 3.文件拷贝,程序为桥梁
    a.建立联系:File对象   源头和目的地
    b.选择流:文件输入流 InputStream FileInputStream
            文件输出流   OutputStream  FileOutputStream 
    c.操作:拷贝
            byte[] flush = new byte[1024];
            int len = 0;
            while(-1 != (len = 输入流.read(flush))){
                输出流.write(flush,0,len)
            }
            输出流.flush
    d.释放资源:关闭两个流
 */
public class CopyFile {
    public static void main(String[] args) {
        String srcPath = "G:/java/test/background.jpg";
        String desPath = "G:/java/test/100.jpg";
        try {
            copyFile(srcPath,desPath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println("文件没有找到");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("文件拷贝失败或者关闭流失败");
        }
    }
    /**
     * 文件的拷贝,传入File参数
     * @param src
     * @param des
     * @throws FileNotFoundException
     * @throws IOException
     */
    public static void copyFile(File src,File des) throws FileNotFoundException,IOException {
        //1.建立联系    源头(存在且为文件) + 目的地(文件可以不存在)
        if(!src.isFile()){
            throw new IOException("只能拷贝文件");
        }
        //des为存在的文件夹,不能建立与文件夹同名的文件
        if(des.isDirectory()){
            System.out.println(des.getAbsolutePath() + "不能建立与文件夹同名的文件");
            throw new IOException(des.getAbsolutePath() + "不能建立与文件夹同名的文件");
        }
        //2.选择流
        InputStream is = new FileInputStream(src);
        OutputStream os = new FileOutputStream(des);
        //3.文件拷贝    循环+读取+写出
        byte[] flush = new byte[1024];
        int len = 0;
        //读出
        while(-1 != (len = is.read(flush))){
            //写出
            os.write(flush,0,len);
        }
        os.flush();//强制刷出
        //关闭流,先打开的后关闭
        os.close();
        is.close();
    }
    /**
     * 文件的拷贝,传入String参数,路径
     * @param srcPath
     * @param desPath
     * @throws FileNotFoundException
     * @throws IOException
     */
    public static void copyFile(String srcPath,String desPath) throws FileNotFoundException,IOException {
        copyFile(new File(srcPath),new File(desPath));
    }
}
package com.test.io.stream;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * 文件夹的拷贝
 * 1.文件 赋值  copyFile()
 * 2.文件夹    创建   mkdirs()
 * 3.递归查找子孙级
 */
public class CopyFolder {
    public static void main(String[] args) {
        //源目录
        String srcPath = "G:/java/test/src";//如果写错为文件,因不能建立与文件夹des同名的文件,所以会抛出异常
        //目标目录
        String desPath = "G:/java/test/des";

        if(srcPath.equals(desPath)){//拒绝自己拷贝给自己
            System.out.println("拒绝自己拷贝给自己");
            return;
        }
        File src = new File(srcPath);
        File des = new File(desPath);
        if(src.isDirectory()){//文件夹
            des = new File(desPath,src.getName());
            if(des.getAbsolutePath().contains(src.getAbsolutePath())){
                System.out.println("父目录不能拷贝到子目录中");
                return;
            }
        }
        copyFolder(src,des);
    }
    /**
     * 拷贝文件夹
     * @param src
     * @param des
     */
    public static void copyFolder(File src,File des){
        if(src.isFile()){//文件
            try {
                CopyFile.copyFile(src, des);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else if(src.isDirectory()){//文件夹
            //确保目标文件夹存在
            des.mkdirs();
            //获取下一级目录或文件
            for(File sub : src.listFiles()){
                copyFolder(sub,new File(des,sub.getName()));
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值