使用IO流将指定目录下的指定格式文件导出到目标目录下的指定格式

/**
     * 场景:公司申请软著,需要将java代码贴到word中,写个小工具

      核心:汇总某个路径下的指定格式的文件到一个统一的目录下,便于统一查看,也可将文本格式进行转换,例如java转doc
     * 
     * 需求分析:
     *     读取指定目录下的文件列表,
     *     找出其中符合条件的所有文件,
     *     写入到指定的目标目录下
     * 
     * 实现思路:
     *  1.文件目录有深度,必须进行深度遍历
     *  2.遍历的过程中过滤符合条件的文件路径存储到容器中
     *  3.对容器中的路径进行遍历,获取文件名,并封装成文件,
     *  4.读取文件并写入到目标路径下
     * 
     */

 

详细代码如下:

package cn.jorian.study.learnning.文件操作;

import lombok.SneakyThrows;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author: jorian
 * @date: 2020/2/26 22:52
 * @description: this is  description for the class
 */
public class FileFilterByType {
    /**
     * 获取所有文件
     * @param dir 指定的文件起始目录
     * @param filter  自定义的文件格式过滤器
     * @param list	原始list容器
     */
    public  List  getFile(File dir, FilenameFilter filter, List list){
        System.out.println("文件遍历中.....");
        //获取目录列表
        File[] files=dir.listFiles();
        //深度遍历
        for(File file:files){
            //是文件夹
            if(file.isDirectory()){
                //递归操作
                getFile(file,filter,list);
            }else{
                //是文件,用格式过滤器筛选
                if(filter.accept(dir, file.getName())){
                    //添加结果到容器
                    list.add(file.getAbsolutePath());
                }
            }
        }
        return list;
    }

    /**
     * 写入到指定目录
     * @param list 文件路径列表
     * @param TargetFile 目标路径
     * @param sourceType    源文件格式
     * @param targetType:文件保存格式例 .doc .txt
     * @throws IOException
     */
    public  void writeToFile(List list, File TargetFile,String sourceType,String targetType) throws IOException {
        int cont=1;
        //遍历列表
        for(String file:list){

            String fileName=new File(file).getName();
            //输入流
            FileInputStream fis = new FileInputStream (new File(file));
            //输出流,输出时文件名去掉后缀,加上我们新的后缀targetType
            fileName = fileName.replace(sourceType,"");
            FileOutputStream fos = new FileOutputStream(new File(TargetFile,(cont)+fileName+targetType));

            //读写操作
            int len=0;
            byte[]buf=new byte[1024];
            while((len=fis.read(buf))!=-1) {

                fos.write(buf, 0, len);
                fos.flush();
            }
            cont++;
            fis.close();
            fos.close();
            System.out.println((cont)+"-"+fileName+targetType+"读写完成.....");
        }

    }

    /**
     * 定义一个文件格式过滤器
     */
    public static class MyFilter implements FilenameFilter {

        /**
         * endWith:文件以什么结尾的格式
         */
        private String endWith;

        MyFilter(String endWith) {
            this.endWith = endWith;
        }

        @Override
        public boolean accept(File dir, String filename) {
            //返回endWith结尾的文件
            return filename.endsWith(this.endWith);
        }
    }

    @SneakyThrows
    public static void main(String []args){
        final String SOURC_TYPE = ".java";
        String TARGET_TYPE = ".doc";
        //指定要读取目录或者盘符
        File dir=new File("E:\\workspace-dyh\\dyh\\com.jorian.web");
        //指定要写入的目录或者盘符
        File TargetFile=new File("E:\\北京项目代码");
        if(!TargetFile.exists()){
            TargetFile.mkdir();
        }
        //初始化一个文件格式过滤器
        FilenameFilter filter=new MyFilter(SOURC_TYPE);

        //遍历指定目录下的文件
        FileFilterByType fileFilterByType=new FileFilterByType();
        List fileNameList=new ArrayList();
        fileNameList = fileFilterByType.getFile(dir,filter,fileNameList);
        //写入到指定目录
        fileFilterByType.writeToFile(fileNameList,TargetFile,SOURC_TYPE,TARGET_TYPE);
        System.out.println("-----共"+fileNameList.size()+"个文件"+"----\n---文件已经保存至:"+TargetFile.getAbsolutePath()+"-------");
    }

}

 

 

 

你可能感兴趣的:(java基础学习)