I/O流完成文件夹复制

I/O流简述

A:IO流概述

IO流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中 java.io

B:IO流分类

a:按照数据流向 站在内存角度
	输入流	读入数据
	输出流	写出数据
b:按照数据类型
	字节流 可以读写任何类型的文件 比如音频 视频  文本文件
	字符流 只能读写文本文件
	什么情况下使用哪种流呢?
	如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流。其他用字节流。
	如果你什么都不知道,就用字节流

输入流读文件,输出流写文件

我们试想生活中的文件复制步骤为Ctrl+C,Ctrl+V,通过这两个步解决问题,IO流完成复制的话也是两个步骤,首先用输入流来完成Ctrl+C,再用输出流完成Ctrl+V。输入流(源文件)每次读取一些信息,输出流在自己的文件里写入这些信息,输入流再读信息,输出流继续把读出的信息写进去,直到输出流读完信息,输入流就完成了信息写入,最终显示的就是文件复制

		File src = new File("G:\\测试图片");//源文件位置
        File target = new File("D:\\" + src.getName());//目标文件位置
        File[] files = target.listFiles();
        FileInputStream in = new FileInputStream(f);
        File file = new File(target, f.getName());
        FileOutputStream out = new FileOutputStream(file);
        int len=0;
        byte[] bytes = new byte[1024 * 8];
        while((len=in.read(bytes))!=-1){
            out.write(bytes,0,len);
            out.flush();
        }
        in.close();
        out.close();

递归实现文件夹复制

因为IO流并不能把文件夹复制出来,只能复制文件夹里的文件,所以我们遇到文件夹的时候先遍历文件夹,把文件给复制出来,当文件夹里含有文件夹的时候,我们再去遍历这个子文件夹,再次遍历文件夹就是在完成递归操作。

File[] files = src.listFiles();
        for (File f : files) {
            if(f.isFile()){
                copy(f,target);
            }else{
                //创建文件夹
                String name = f.getName();
                target=new File(target,name);
                fileCopy(f,target);
            }
        }

当然,我们在递归遍历文件夹的时候,需要创建该子文件夹,把子文件夹封装起来,传递给fileCopy(),通过该方法实现子文件夹创建

private static void fileCopy(File src, File target) throws IOException {
        //target = new File(src.getName());

        if(!target.exists()){
            target.mkdirs();
            copyFile(src,target);
        }else{
            copyFile(src,target);
        }
    }

源代码

public class MyTest {
    public static void main(String[] args) throws IOException {
        File src = new File("G:\\测试图片");
        File target = new File("D:\\" + src.getName());
        fileCopy(src, target);
        fileChangename(target);

    }

    private static void fileChangename(File target) {
        File[] files = target.listFiles();
        for (File f : files) {
            if(f.isFile()){
                if(f.getName().endsWith(".jpg")){
                    String fParent = f.getParent();
                    String s = f.getName().replace(".jpg", ".png");
                    File f2=new File(fParent,s);
                    boolean b = f.renameTo(f2);
                    System.out.println(b);
                }
            }else{
                fileChangename(f);
            }
        }
    }

    private static void fileCopy(File src, File target) throws IOException {
        //target = new File(src.getName());

        if(!target.exists()){
            target.mkdirs();
            copyFile(src,target);
        }else{
            copyFile(src,target);
        }
    }

    private static void copyFile(File src, File target) throws IOException {
        File[] files = src.listFiles();
        for (File f : files) {
            if(f.isFile()){
                copy(f,target);
            }else{
                //创建文件夹
                String name = f.getName();
                target=new File(target,name);
                fileCopy(f,target);
            }
        }
    }

    private static void copy(File f, File target) throws IOException {
        FileInputStream in = new FileInputStream(f);
        File file = new File(target, f.getName());
        FileOutputStream out = new FileOutputStream(file);
        int len=0;
        byte[] bytes = new byte[1024 * 8];
        while((len=in.read(bytes))!=-1){
            out.write(bytes,0,len);
            out.flush();
        }
        in.close();
        out.close();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值