目录

  • 1 文件拷贝,强制覆盖目标文件
  • 2 复制文件夹
  • 3 创建父目录路径和子目录路径
  • 4 把多个文件夹打成.tar.gz包(从当前的目录开始)
  • 5 判断字符串是不是以数字开头
  • 6 判断文件是否有后缀
  • 7 获取当前项目所在的路径
  • 8 从TXT文件读取东西
  • 9 从文件夹里面查询文件
  • 10 根据时间分类,创建文件夹
  • 11 读取当前时间前三天的数据,进行删除
  • 12 获取文件名的后缀
  • 13 获取文件的修改时间
  • 14 判断字符串是不是都是数字
  • 15 根据file递归删除文件夹下的全部数据
  • 16 递归读取文件路径下的 没有后缀的 所有文件
  • 17 往文件里面写内容
  • 18 根据文件路径,读取文件内容
  • 19 定时迁移数据到时间文件夹下


1 文件拷贝,强制覆盖目标文件

//文件拷贝,强制覆盖目标文件
    public static void copyFileForce(File file, File fileTo){
        try {
            Files.copy(file.toPath(),fileTo.toPath(), StandardCopyOption.REPLACE_EXISTING.REPLACE_EXISTING);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2 复制文件夹

复制文件夹
将源文件的外层目录也拷贝入新目录下

/**
     *
     * <p>Method :copyDirectory
     * <p>Description :  复制文件夹
     *                  将源文件的外层目录也拷贝入新目录下
     * @param sourcePathString
     * @param targetPathString
     */
    public static void copyDirectory(String sourcePathString,String targetPathString){
        if(!new File(sourcePathString).canRead()){
            System.out.println("源文件夹" + sourcePathString + "不可读,无法复制!");
        }else{
            // yin 本地测试,上传记得更改为一个斜杠
            String endDir = sourcePathString.split(File.separator)[sourcePathString.split(File.separator).length-1];
            //将源文件的外层目录也拷贝入新目录下
            targetPathString = targetPathString+File.separator+endDir;
            (new File(targetPathString)).mkdirs();
            System.out.println("开始复制文件夹" + sourcePathString + "到" + targetPathString);
            File[] files = new File(sourcePathString).listFiles();
            for (File file : files) {
                if (file.isFile()) {
                    copyFileForce(new File(sourcePathString + File.separator + file.getName()), new File(targetPathString + File.separator + file.getName()));
                } else if (file.isDirectory()) {
                    copyDirectory(sourcePathString + File.separator + file.getName(), targetPathString);
                }
            }
            System.out.println("复制文件夹" + sourcePathString + "到" + targetPathString + "结束");
        }
    }

3 创建父目录路径和子目录路径

给一个父路径,一个子路径,如果不存在就创建

/**
     * 构建目录
     * @param outputDir
     * @param subDir
     */
    private static void createDirectory(String outputDir,String subDir){
        File file = new File(outputDir);
        if(!(subDir == null || subDir.trim().equals(""))){//子目录不为空
            file = new File(outputDir + "/" + subDir);
        }
        if(!file.exists()){
            if(!file.getParentFile().exists())
                file.getParentFile().mkdirs();
            file.mkdirs();
        }
    }

4 把多个文件夹打成.tar.gz包(从当前的目录开始)

/**
     * 把多个文件夹打成.tar.gz包(从当前的目录开始)
     * @param sourceFolder 需要打成.tar.gz包的目录列表(包含目录和目录下的所有文件和文件夹)
     * @param tarGzPath  打成的tar包生成的目标目录 例: D:/tmp  最终打包会在 D:/tmp目录下生成 test.tar.gz包
     * @param tarGzFileName 打tar.gz包的名,例如:ide-sdk.tar.gz
     */
    public static void fileListToTar(List<String> sourceFolder, String tarGzPath, String tarGzFileName) {
        TarArchiveOutputStream tarOs = null;
        try {
            for(String folder : sourceFolder){
                File sourceFile = new File(folder);
                if (!sourceFile.exists()) {
                    throw new FileNotFoundException("压缩的目录不存在。。。");
                }
            }
            tarOs = createTar(tarGzPath,tarGzFileName,tarOs);
            for(String folder : sourceFolder){
                addFileListToTarGZ(folder, tarOs);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                tarOs.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 把文件复制到.tar.gz包中
     * @param sourceFile 需要复制的文件路径
     * @param tarArchive tar包流
     * @throws IOException 异常
     */
    private static void addFileListToTarGZ(String sourceFile, TarArchiveOutputStream tarArchive)
            throws IOException {
        File file = new File(sourceFile);
        String parent = sourceFile.split(File.separator)[sourceFile.split(File.separator).length-2];
        String entryName = parent +File.separator+ file.getName();
        // 添加 tar ArchiveEntry
        tarArchive.putArchiveEntry(new TarArchiveEntry(file, entryName));
        if (file.isFile()) {
            FileInputStream fis = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(fis);
            // 写入文件
            IOUtils.copy(bis, tarArchive);
            tarArchive.closeArchiveEntry();
            bis.close();
        }
    }


 /**
     *  创建tar包的流
     * @param tarGzPath 需要复制的文件路径
     * @param tarGzFileName 文件名称
     * @param tarOs tar包流
     * @throws IOException 异常
     */
    private static TarArchiveOutputStream createTar(String tarGzPath, String tarGzFileName,TarArchiveOutputStream tarOs) throws IOException {
        File tarGzFile = new File(tarGzPath);
        if (!tarGzFile.exists()) {
            tarGzFile.mkdirs();
        }
        // 创建一个 FileOutputStream 到输出文件(.tar.gz)
        File tarFile = new File(tarGzFile + "/" + tarGzFileName);
        FileOutputStream fos = new FileOutputStream(tarFile);
        // 创建一个 GZIPOutputStream,用来包装 FileOutputStream 对象
        GZIPOutputStream gos = new GZIPOutputStream(new BufferedOutputStream(fos));
        // 创建一个 TarArchiveOutputStream,用来包装 GZIPOutputStream 对象
        tarOs = new TarArchiveOutputStream(gos);
        // 若不设置此模式,当文件名超过 100 个字节时会抛出异常,异常大致如下:
        // is too long ( > 100 bytes)
        // 具体可参考官方文档:http://commons.apache.org/proper/commons-compress/tar.html#Long_File_Names
        tarOs.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX);
        return tarOs;
    }

5 判断字符串是不是以数字开头

/**
     * @Description: 判断字符串是不是以数字开头
     */
    public static boolean isStartWithNumber(String str) {
        Pattern pattern = Pattern.compile("[0-9]*");
        Matcher isNum = pattern.matcher(str.charAt(0)+"");
        if (!isNum.matches()) {
            return false;
        }
        return true;
    }

6 判断文件是否有后缀

/**
     * @Description: 判断文件是否有后缀
     */
    public static boolean verificationFile(String originFileName){
        // 后缀
        int num = originFileName.lastIndexOf(".");
        if(num == -1) {
            return true;
        }
        return false;
    }

7 获取当前项目所在的路径

File file1 = new File(System.getProperty("user.dir"));

8 从TXT文件读取东西

File file1 = new File(System.getProperty("user.dir"));
        File file = new File(file1.getPath() + str + "demo.txt");


  		BufferedReader reader = null;
        String tempString = null;
        int line =1;


        try {
//            System.out.println("以行为单位读取文件内容,一次读一整行:");
            reader = new BufferedReader(new FileReader(file));
            while ((tempString = reader.readLine()) != null) {
//                读取第一行
                if(1 == line){
                    source = tempString;
//                    读取第二行
                }else if (2 == line){
                    desc = tempString;
                }else {
                    okfile = tempString;
                }
                line ++ ;
            }
            reader.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally{
            if(reader != null){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

9 从文件夹里面查询文件

path 原路径文件夹里面有很多的数据,想拿出来做一些处理,对于已经处理过的,将在另一个文件夹里面保存为后缀为ok;

只要一个文件创建过ok文件,就是处理过的,下一次遍历拿数据,就不把他拿出来了;

// 存放过滤出来的  文件
            ArrayList<String> paths1 = new ArrayList<>();
 /**
     * 递归读取文件路径下的 没有后缀的  所有文件
     *  根据当前的时间  G:\demo\2022\202208\20220802
     * @param path  原路径
     * @param fileNameList 存放过滤出来的文件
     * @param okpath   .ok路径
     */
    public static ArrayList<String> readFiles(String path, ArrayList<String> fileNameList,String okpath) {
//        String newPathInfo = newPath(path);
        String str = File.separator;
        File file = new File(path);
        if (file.isDirectory()) {
            //  当前是文件夹
            File[] files = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                if (files[i].isDirectory()) {
                    //  判断是否是文件夹,如果是文件夹,递归读取
                    readFiles(files[i].getPath(), fileNameList,okpath);
                }
                else {
                    String path1 = files[i].getName(); // 获取当前文件的名称
                    if(path1.startsWith("W_NAFP_C_ECMF")  && verificationFile(path1)){
                        if(!new File(okpath+str+path1+".ok").exists()){
//                            ok文件不存在
                            fileNameList.add(files[i].getPath());
                        }
                    }
                }
            }
        }
        else {
            String path1 = file.getName();
            if(path1.startsWith("W_NAFP_C_ECMF")  && verificationFile(path1)){
                if(!new File(okpath+str+path1+".ok").exists()){
                    //                            ok文件不存在
                    fileNameList.add(path1);
                }
            }
        }
        return fileNameList;
    }




 /**
     * @Description: 判断文件是否有后缀
     */
    public static boolean verificationFile(String originFileName){
        // 后缀
        int num = originFileName.lastIndexOf(".");
        if(num == -1) {
            return true;
        }
        return false;
    }

10 根据时间分类,创建文件夹

在一个文件夹下,想定时生成每天的数据,将数据以天分开,也就是时间文件夹名称隔开;比如在

H:\www\

这个文件夹下,生成时间名称 20220801文件夹 20220802文件夹

H:\www\20220801
H:\www\20220802

以上的这种格式

// 创建当前起报时间  的文件夹,
    //  获取到当前的时间
  String qbtime = DateUtils.dateToString(obsTime, DateUtils.dateType1);

   File qbfile1 = new File(descfile.getPath(),qbtime);
   if(!qbfile1.exists()){
       try {
           qbfile1.mkdir();
       } catch (Exception e) {
           e.printStackTrace();
           log.info(">>>>>>>>> 创建.ok文件失败");
       }

   }

11 读取当前时间前三天的数据,进行删除

H:\www\20220801
H:\www\20220802

以以上的这种格式,进行文件夹的删除,具体逻辑:

//        先获取当前日期前三天的时间
        String qsantian = DateUtils.Qsantian();//        前3天时间
        Date date2 = DateUtils.stringToDate(qsantian, DateUtils.DATE_FORMAT_YYYY_MM_DD);
        List<String> newfilesinfo = new ArrayList<>();// 存放过期的文件夹
        List<String> filesinfo = new ArrayList<>();// 存放文件夹的名称
//        遍历路径,获取当前路径下的文件夹名称
        File descfile = new File(desc);
        File[] files = descfile.listFiles();
        for(File item:  files){
            if(item.isDirectory()){
                if(item.getName().length()==10){
//                    System.out.println(item.getName());
                    filesinfo.add(item.getName());
                }

            }

        }

        for(String item:filesinfo){
//            获取到每一个文件夹的名称
            Date date = DateUtils.stringToDate(item, DateUtils.dateType1);
            Date date1 = DateUtils.dateFormat(date, DateUtils.DATE_FORMAT_YYYY_MM_DD);
//            String s = DateUtils.dateToString(date1, DateUtils.DATE_FORMAT_YYYY_MM_DD);
//            System.out.println(s);

            if(date1.before(date2)){
                newfilesinfo.add(item);

            }


        }

//        System.out.println(newfilesinfo.size());

        for(String item:newfilesinfo){
            for(File items:  files) {
                if (items.isDirectory()) {
                    if (items.getName().length() == 10) {
                        if(items.getName().startsWith(item)){
//                            File file2 = new File(file.getPath(), items.getName());
                            FileInfoUtils.remove(items);
                        }
                    }
                }
            }

        }
    }

12 获取文件名的后缀

//使用lastIndexOf()结合subString()获取后缀名
public String lastName(File file){
    if(file==null) return null;
    String filename = file.getName();
    if(filename.lastIndexOf(".")==-1){
        return "";//文件没有后缀名的情况
    }
    //此时返回的是带有 . 的后缀名,
    return filename.subString(filename.lastIndexOf("."));
 
    //return filename.subString(filename.lastIndexOf(".")+1);// 这种返回的是没有.的后缀名
    
    // 下面这种如果对于String类型可能有问题,如 以.结尾的字符串,会报错。但是文件没有以点结尾的
}
// split截取后缀名
    public String lastName(File file) {
        if (file == null) return null;
        String filename = file.getName();
        // split用的是正则,所以需要用 //. 来做分隔符
        String[] split = filename.split("\\.");
        //注意判断截取后的数组长度,数组最后一个元素是后缀名
        if (split.length > 1) {
            return split[split.length - 1];
        } else {
            return "";
        }
    }

13 获取文件的修改时间

File file = new File("H:\\Config.py");

        Long lastModified = file.lastModified();
        Date date = new Date(lastModified);
        System.out.println(DateUtils.dateToString(date,DateUtils.dateType7));

14 判断字符串是不是都是数字

/**
     * @Description: 判断字符串是不是都是数字
     */
    public static boolean StrisNumber(String str) {
        Pattern pattern = Pattern.compile("[0-9]*");
        Matcher isNum = pattern.matcher(str);
        if (!isNum.matches()) {
            return false;
        }
        return true;
    }

15 根据file递归删除文件夹下的全部数据

/**
     * 删除指定文件夹下的全部内容
     * @param file
     */
    public static void remove(File file) {
        File[] files = file.listFiles();//将file子目录及子文件放进文件数组
        if (files != null) {//如果包含文件进行删除操作
            for (int i = 0; i < files.length; i++) {
                if (files[i].isFile()) {//删除子文件
                    files[i].delete();
                } else if (files[i].isDirectory()) {//通过递归方法删除子目录的文件
                    remove(files[i]);
                }
                files[i].delete();//删除子目录
            }
        }
        file.delete();
    }
/**
     * delete recursively   递归删除
     * @param root  文件路径
     * @return
     */
    public static boolean deleteRecursively(File root) {
        if (root != null && root.exists()) {
//            如果传进来的路径存在

            if (root.isDirectory()) {
//                如果是文件夹
                File[] children = root.listFiles();
                if (children != null) {
                    for (File child : children) {
//                        递归
                        deleteRecursively(child);
                    }
                }
            }
//            如果是文件  就删除
            return root.delete();
        }
        return false;
    }

16 递归读取文件路径下的 没有后缀的 所有文件

/**
     * 递归读取文件路径下的 没有后缀的  所有文件
     *  根据当前的时间  G:\demo\2022\202208\20220802
     * @param path  原路径
     * @param fileNameList 存放过滤出来的文件
     * @param okpath   .ok路径
     */
    public static ArrayList<String> readFiles(String path, ArrayList<String> fileNameList,String okpath) {
//        String newPathInfo = newPath(path);
        String str = File.separator;
        File file = new File(path);
        if (file.isDirectory()) {
            //  当前是文件夹
            File[] files = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                if (files[i].isDirectory()) {
                    //  判断是否是文件夹,如果是文件夹,递归读取
                    readFiles(files[i].getPath(), fileNameList,okpath);
                }
                else {
                    String path1 = files[i].getName(); // 获取当前文件的名称
                    if(path1.startsWith("W_NAFP_C_ECMF")  && verificationFile(path1)){
                        if(!new File(okpath+str+path1+".ok").exists()){
//                            ok文件不存在
                            fileNameList.add(files[i].getPath());
                        }
                    }
                }
            }
        }

        else {
            String path1 = file.getName();
            if(path1.startsWith("W_NAFP_C_ECMF")  && verificationFile(path1)){
                if(!new File(okpath+str+path1+".ok").exists()){
                    //                            ok文件不存在
                    fileNameList.add(path1);
                }
            }
        }
        return fileNameList;
    }

17 往文件里面写内容

/**
     * 往文件里面写内容
     * @param file  单个文件
     * @return
     */
    public static void writeFileContent(File file, byte[] data) {

        // file
        if (!file.exists()) {
            file.getParentFile().mkdirs();
        }

        // append file content   追加文件内容
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(file);
            fos.write(data);
            fos.flush();
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    logger.error(e.getMessage(), e);
                }
            }
        }

    }

18 根据文件路径,读取文件内容

/**
     * 根据文件路径,读取文件内容
     * @param file  单个文件
     * @return
     */
    public static byte[] readFileContent(File file) {
        Long filelength = file.length();
        byte[] filecontent = new byte[filelength.intValue()];

        FileInputStream in = null;
        try {
            in = new FileInputStream(file);
            in.read(filecontent);
            in.close();

            return filecontent;
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            return null;
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    logger.error(e.getMessage(), e);
                }
            }
        }
    }

19 定时迁移数据到时间文件夹下

/**
     * 迁移路径下的数据到 时间文件夹下
     * @param path
     */
    public static void moveFilesToTodayFolder(String path) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        String todayFolderName = dateFormat.format(new Date());

        File pathFile = new File(path);
        File todayFolder = new File(pathFile, todayFolderName);

        // 如果当天的文件夹不存在,则创建
        if (!todayFolder.exists()) {
            todayFolder.mkdir();
        }

        // 将 path 下的所有文件移动到当天的文件夹下
        File[] files = pathFile.listFiles();
        for (File file : files) {
            if (file.isFile()) {
                file.renameTo(new File(todayFolder, file.getName()));
            }
        }
    }