【Java学习】IO流对文件文件夹和多级文件夹操作(17)


IO流的继承关系与学习的类
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


1.四种复制文件的方法

首先找一个稍微大一点的文件(10mb左右)放在G盘下,文件名改为video.avi
如果没有g盘,就相应的改代码中的文件路径

IO操作必须释放IO资源close();

采用多种方式,把G:\video.avi的内容复制到G:\video1.avi中
方式1:基本字节流一次读写一个字节
方式2:基本字节流一次读写一个字节数组
方式3:高效字节流一次读写一个字节
方式4:高效字节流一次读写一个字节数组

package com.jingfei.day20;

import java.io.*;

public class Demo2 {
    public static void main(String[] args) throws IOException {
        fanc1();
        fanc2();
        fanc3();
        fanc4();

    }

    private static void fanc4() throws IOException {
        //方式4:高效字节流一次读写一个字节数组
        BufferedInputStream in = new BufferedInputStream(new FileInputStream("g:\\video.avi"));
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("g:\\video4.avi"));
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len = in.read(bytes)) != -1) {
            out.write(bytes, 0, len);
        }
        out.close();
        in.close();

    }

    private static void fanc3() throws IOException {
        //方式3:高效字节流一次读写一个字节
        BufferedInputStream in = new BufferedInputStream(new FileInputStream("g:\\video.avi"));
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("g:\\video3.avi"));
        int len = 0;
        while ((len = in.read()) != -1) {
            out.write(len);
        }
        out.close();
        in.close();


    }

    private static void fanc2() throws IOException {
        //方式2:基本字节流一次读写一个字节数组
        FileInputStream in = new FileInputStream("g:\\video.avi");
        FileOutputStream out = new FileOutputStream("g:\\video2.avi");
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len = in.read(bytes)) != -1) {
            out.write(bytes, 0, len);
        }
        out.close();
        in.close();
    }

    private static void fanc1() throws IOException {
        //方式1:基本字节流一次读写一个字节
        FileInputStream in = new FileInputStream("g:\\video.avi");
        FileOutputStream out = new FileOutputStream("g:\\video1.avi");
        int len = 0;
        while ((len = in.read()) != -1) {
            out.write(len);
        }
        out.close();
        in.close();
    }
}


2.递归删除文件夹中的所有文件,以及嵌套的文件夹和其中的文件

删除: G盘中的java文件夹及里面的所有文件.

package com.jingfei.day20;

import java.io.File;

public class Demo {
    public static void main(String[] args) {
        File file = new File("G:\\java");
        delFile(file);
    }

    private static void delFile(File f) {
        File[] files = f.listFiles();
        if (files != null) {
            for (File file1 : files) {
                if (file1.isFile()) {
                    file1.delete();
                    //System.out.println(file1.getName());
                } else {
                    delFile(file1);
                }
            }f.delete();
        }
    }
}


3.递归多级文件夹操作后缀名

得到所有文件名为.Java的文件文件名

package com.jingfei.day20;

import java.io.File;

public class Demo {
    public static void main(String[] args) {
        File file = new File("G:\\java");
        delFile(file);
    }

    private static void delFile(File f) {
        File[] files = f.listFiles();
        if (files != null) {
            for (File file1 : files) {
                if (file1.isFile()) {
                    System.out.println(file1.getName());
                } else {
                    delFile(file1);
                }
            }
        }
    }
}


利用FilenameFilter文件名过滤器得到多级文件夹中的.avi文件的完整路径

package com.jingfei.day19;

import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;

public class Demo2 {
    public static void main(String[] args) {
        //判断指定文件夹中是否有某后缀名的文件,输出完整路径
        File file = new File("g:/java");
        searchFile(file);
    }

    private static void searchFile(File file) {
        File[] files = file.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                File file1 = new File(dir, name);
                if (file1.isFile() && name.endsWith("avi")) {
                    return true;
                } else if(file1.isDirectory()){
                    searchFile(file1);
                    return false;
                }else return false;
            }
        });
        //System.out.println(Arrays.toString(files));
        if (files != null) {
            for (File f : files) {
                System.out.println(f.getAbsolutePath());
            }
        }
    }
}

4.批量将G:\java文件夹里的后缀名.png文件改为.jpg

package com.jingfei.day20;

import java.io.File;

public class Demo3 {
    public static void main(String[] args) {
        File file = new File("G:\\java");
        //将G:\java文件夹里的后缀名.png改为.jpg
        delFile(file);
    }

    private static void delFile(File f) {
        File[] files = f.listFiles();
        if (files != null) {
            for (File file1 : files) {
                if (file1.isFile() && file1.getName().endsWith(".png")) {
                    String name = file1.getName();
                    String s = name.substring(0, name.indexOf('.'));//保留原有名称
                    file1.renameTo(new File(file1.getParent(), s + ".jpg"));//变为你要改的后缀名
                } else {
                    delFile(file1);
                }
            }
        }
    }
}


5.将一个文件复制多份

必须放入循环中,如果不放循环中,必须重新new你复制的那个文件,将指针重新置于开头,否则会出现只有第一个有内容,之后的都是空的.

package com.jingfei.day20;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo4 {
    public static void main(String[] args) throws IOException {
        File file = new File("D:\\test.txt");
        byte[] bytes = new byte[1024];//缓冲区1024字节
        for (int i = 0; i < 3; i++) {
            FileInputStream in = new FileInputStream("d:\\test.txt");
            //必须放入循环中,如果不放循环中,必须重新new,将指针重新置于开头
            //否则会出现只有第一个有内容,之后的都是空的.
            FileOutputStream out = new FileOutputStream("d:\\file"+i+".txt");//区别文件名
            int len = 0;//得到读到字节实际长度,可能会为存满
            while ((len = in.read(bytes)) != -1) {
                out.write(bytes,0,len);//写入从0索引开始,长度为len
            }
            out.close();
            in.close();
        }


    }
}


6.递归对多级文件夹的复制操作

复制单个文件
复制整个文件:复制多级文件夹
思路:
1.封装整个原文件夹
2.创建目标文件夹
3.遍历源文件夹,将原文件夹下的所有文件,复制到目标文件夹

package com.westos.Demo2;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;

/**
 * @Author: Administrator
 * @CreateTime: 2019-01-17 10:02
 */
public class CopyFileDemo2 {
    public static void main(String[] args) throws IOException {
        //复制单个文件
        //复制整个文件:复制多级文件夹
        //思路:1.封装整个原文件夹
        //2.创建目标文件夹
        //3.遍历源文件夹,将原文件夹下的所有文件,复制到目标文件夹
        File srcFolder = new File("G:\\java");
        //封装目标文件夹
        File targetFolder = new File("D:\\java");
        //如果目标文件夹不存在,就创建出来
        if (!targetFolder.exists()) {
            targetFolder.mkdirs();
        }
        //进行复制操作
        copyFolders(srcFolder, targetFolder);


    }

    private static void copyFolders(File srcFolder, File targetFolder) throws IOException {
        //实现复制操作
        File[] files = srcFolder.listFiles(); //获取该目录下,所有的文件和文件夹
        //遍历复制每个文件
        for (File f : files) {
            if (f.isFile()) {             
                    copyFile(f, targetFolder);
            } else {
                //如果是文件夹,
                // 1. 封装整个原文件夹
                //3.递归调用
                File detFile = new File(targetFolder + "\\" + f.getName());
                if (!detFile.exists()) {
                    detFile.mkdirs();
                }
                copyFolders(f, detFile);
            }
        }
    }

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


7.在复制多级文件夹时候,对里面的.jpg格式的文件,重命名(随机字符串)并改后缀名为.png

对6中的代码加了一个方法重载

package com.westos.Demo2;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;

/**
 * @Author: Administrator
 * @CreateTime: 2019-01-17 10:02
 */
public class CopyFileDemo2 {
    public static void main(String[] args) throws IOException {
        //复制单个文件
        //复制整个文件:复制多级文件夹
        //思路:1.封装整个原文件夹
        //2.创建目标文件夹
        //3.遍历源文件夹,将原文件夹下的所有文件,复制到目标文件夹
        File srcFolder = new File("G:\\java");
        //封装目标文件夹
        File targetFolder = new File("D:\\java");
        //如果目标文件夹不存在,就创建出来
        if (!targetFolder.exists()) {
            targetFolder.mkdirs();
        }
        //进行复制操作
        copyFolders(srcFolder, targetFolder);


    }

    private static void copyFolders(File srcFolder, File targetFolder) throws IOException {
        //实现复制操作
        File[] files = srcFolder.listFiles(); //获取该目录下,所有的文件和文件夹
        //遍历复制每个文件
        for (File f : files) {
            if (f.isFile()) {
                //生成随机的名称

                if (f.getName().endsWith(".jpg")) {
                    //生成随机字符串去前16位
                    String string = UUID.randomUUID().toString().replace("-", "").substring(0, 16);
                    String name = string+".png";//这是你要重命名的格式,我用的是随机字符串
                    copyFile(f, targetFolder,name);//方法重载
                    //f.renameTo();//不能用这个,这个是剪贴并改名
                } else {
                    copyFile(f, targetFolder);
                }

            } else {
                //如果是文件夹,
                // 1. 封装整个原文件夹
                //3.递归调用
                File detFile = new File(targetFolder + "\\" + f.getName());
                if (!detFile.exists()) {
                    detFile.mkdirs();
                }
                copyFolders(f, detFile);
            }
        }
    }

    private static void copyFile(File f, File targetFolder) throws IOException {
        FileInputStream in = new FileInputStream(f);
        FileOutputStream out = new FileOutputStream(new File(targetFolder, f.getName()));
        byte[] bytes = new byte[1024 * 8];
        int len = 0;
        while ((len = in.read(bytes)) != -1) {
            out.write(bytes, 0, len);
            out.flush();
        }
        in.close();
        out.close();
    }
    private static void copyFile(File f, File targetFolder,String name) throws IOException {
        FileInputStream in = new FileInputStream(f);
        FileOutputStream out = new FileOutputStream(new File(targetFolder, name));//变化的部分在这里
        byte[] bytes = new byte[1024 * 8];
        int len = 0;
        while ((len = in.read(bytes)) != -1) {
            out.write(bytes, 0, len);
            out.flush();
        }
        in.close();
        out.close();
    }
}



谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值