热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

优化读取的异步文件过多问题

适用场景:第三方公司会有很多异步通知文件上传到我的ftp服务器上,当解析的时候会依次遍历,时间久了需要遍历的会越来越多,这时

适用场景: 第三方公司会有很多异步通知文件上传到我的 ftp 服务器上,当解析的时候会依次遍历,时间久了需要遍历的会越来越多,这时就需要优化一下,下面是我的优化方案: 移除文件到指定备份路径下,可以查看文件:testFileRemove.java
(方案:对于已经处理过的文件可以选择移除到备份文件夹下,避免处理前遍历文件过多)

package com.msyd.util;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.msyd.ebei.exception.PlatformException;public class testFileRemove {private static Logger logger = LoggerFactory.getLogger(testFileRemove.class);public static final String cz_zip_path = "/app/sftp/zsbank/MSYD";//对账文件保存路径public static final String cz_zip_path_bak = "/app/sftp/zsbank/MSYDNotifyFileBak";//异步通知对账文件解析入库后,将该文件备份到此路径@Testpublic void testRemove() {File fileDir = new File(CommonDef.cz_zip_path);if (!fileDir.exists()) {logger.error("保存文件夹不存在!");return;}String[] files = fileDir.list();batchRemoveOldFiles(files);}/**移动前十天已经处理过的文件* 定时任务每次最多允许移除20个文件至备份文件夹下*/public void batchRemoveOldFiles(String[] files) {if (null == cz_zip_path_bak) {return;}int succ = 0;String dateStr2 = formatToYYYYMMDDSDF(addDays(new Date(), -10)); // 前days天日期for (int i = 0; i Integer.parseInt(dateStr2)) {//如果对账文件的交易日期小于配置日期logger.info("对账文件交易日期为" + tradeDateStr + ",大于" + dateStr2 + "," + f + "不需要写入到MSYDNotifyFileBak内");continue;}//确认处理过之后,可以进行移除操作int count = 1;// psmm.getCountBankAccountFile(f);if (count > 0) {logger.info("文件" + f + "已经入库,可以转移到上级目录的同级文件夹MSYDNotifyFileBak内");try {doRemove(f);//把文件移动到指定文件夹内,同时删除当前文件夹内的压缩文件++succ;} catch (PlatformException e) {logger.info(e.getMessage(), e);}continue;}}}public void doRemove(String fileName) throws PlatformException {boolean b = true;File dir = new File(cz_zip_path + File.separator + fileName);String toPath = cz_zip_path_bak;File fileJia = new File(toPath);if (dir.isDirectory()) //检查一个对象是否是文件夹doRemove(fileName);else {// 如果文件夹不存在则创建if (!fileJia.exists() && !fileJia.isDirectory()) {b = fileJia.mkdir();//mkdirs 如果是多级目录都是未创建,可以调用mkdirs方法}if (!b) {throw new PlatformException("文件夹创建失败");}b = dir.renameTo(new File(toPath + File.separator + dir.getName()));if (!b) {throw new PlatformException("移动文件至指定路径失败");}}}/** 这是根据具体问题具体分析* getTradeDate(获取交易日期) * @param name* @return String DOM对象 * @Exception 异常对象 * @since CodingExample Ver(编码范例查看) 1.1* 待处理的SFTP上的文件类似于这种:
* BT_SPF1707180029655_20171030.zip
* AB_DPF1707180029655_20171030.zip
* CHD_20171030_EPF1707180029655.zip
* EF_20171030.zip*/private String getTradeDate(String f) {String str = f.substring(0, f.lastIndexOf("."));String[] interceptDateStr = str.split("_");String tradeDateStr = "";if (f.startsWith("BT_")) {//批量扣款对账文件前缀tradeDateStr = interceptDateStr[2];} else if (f.startsWith("AB_")) {//批量还款对账文件前缀tradeDateStr = interceptDateStr[2];} else if (f.startsWith("CHD_")) {//开销户对账文件前缀tradeDateStr = interceptDateStr[1];} else if (f.startsWith("EF_")) {//商户对账文件前缀tradeDateStr = interceptDateStr[1];} else if (f.startsWith("GH_")) {//平台分账对账文件前缀tradeDateStr = interceptDateStr[2];} else if (f.startsWith("IJ_")) {//内部户对账文件前缀tradeDateStr = interceptDateStr[2];}return tradeDateStr;}public static String formatToYYYYMMDDSDF(Date date) {SimpleDateFormat sf = new SimpleDateFormat("YYYYMMdd");if (date != null) {return sf.format(date);} else {return "null";}}/*** 取得指定天数的日期* @param dateFormat* @return 日期类型*/public static Date addDays(Date date, int diffDays) {try {Calendar calendar = Calendar.getInstance();calendar.setTime(date);calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + diffDays);return calendar.getTime();} catch (Exception e) {e.printStackTrace();return null;}}}

【下面这个人写的很好,怕链接流失,所以直接拷贝到下面了,参考资料为:http://www.zuidaima.com/share/1915525327801344.htm】

package com.msyd.util;import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;import org.junit.Test;/**java file文件类操作使用方法大全*/
public class fileUtil {@Testpublic void test0() {//构造函数File(String pathname)File f1 = new File("c:\\zuidaima\\1.txt");//File(String parent,String child)File f2 = new File("c:\\zuidaima", "2.txt");//File(File parent,String child)File f3 = new File("c:" + File.separator + "abc");//separator 跨平台分隔符File f4 = new File(f3, "3.txt");System.out.println(f1);//c:\zuidaima\1.txt}/*创建方法1.boolean createNewFile() 不存在返回true 存在返回false2.boolean mkdir() 创建目录3.boolean mkdirs() 创建多级目录删除方法1.boolean delete()2.boolean deleteOnExit() 文件使用完成后删除*/@Testpublic void test1() {File f = new File("d:\\zuidaima\\1.txt");try {System.out.println(f.createNewFile());//当文件存在时返回falseSystem.out.println(f.delete());//当文件不存在时返回false} catch (IOException e) {e.printStackTrace();}}/*判断方法1.boolean canExecute()判断文件是否可执行2.boolean canRead()判断文件是否可读3.boolean canWrite() 判断文件是否可写4.boolean exists() 判断文件是否存在5.boolean isDirectory() 6.boolean isFile()7.boolean isHidden()8.boolean isAbsolute()判断是否是绝对路径 文件不存在也能判断获取方法1.String getName()2.String getPath()3.String getAbsolutePath()4.String getParent()//如果没有父目录返回null5.long lastModified()//获取最后一次修改的时间6.long length()7.boolean renameTo(File f)8.File[] liseRoots()//获取机器盘符9.String[] list() 10.String[] list(FilenameFilter filter)*//**列出磁盘下的文件和文件夹*/@Testpublic void test2() {File[] files = File.listRoots();for (File file : files) {System.out.println(file);if (file.length() > 0) {String[] filenames = file.list();for (String filename : filenames) {System.out.println(filename);}}}}/**文件过滤*/@Testpublic void test3() {File[] files = File.listRoots();for (File file : files) {System.out.println(file);if (file.length() > 0) {String[] filenames = file.list(new FilenameFilter() {//file 过滤目录 name 文件名public boolean accept(File file, String filename) {return filename.endsWith(".mp3");}});for (String filename : filenames) {System.out.println(filename);}}}}/*File[] listFiles()File[] listFiles(FilenameFilter filter)*//**利用递归列出全部文件*/@Testpublic void test4() {File f = new File("e:\\zuidaima");showDir(f);}public void showDir(File dir) {System.out.println(dir);File[] files = dir.listFiles();for (File file : files) {if (file.isDirectory())showDir(file);elseSystem.out.println(file);}}/**移动文件
找出d盘下所有的 .java 文件,拷贝至 c:\jad 目录下,并将所有文件的类型由.java 修改为.jad 。*/@Testpublic void test5() {File f1 = new File("d:\\zuidaima\\");moveFile(f1);}public static void moveFile(File dir) {File[] files = dir.listFiles();for (File file : files) {if (file.isDirectory())moveFile(file);else {if (file.getName().endsWith(".java"))file.renameTo(new File("c:\\jad\\" + file.getName().substring(0, file.getName().lastIndexOf('.')) + ".jad"));}}}
}

推荐阅读
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
author-avatar
林韵杰64833
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有