上篇博文讲到为了解决tomcat日志自动清理的问题,翻看了tomcat-juli这个jar包。在FileHandler类下有一个利用nio完成对磁盘下过期文件进行过滤的功能实现,正好这段时间正在学习nio框架,所以特意抽离源码做了一下测试。以下将提供测试代码(主要代码摘抄自tomcat-juli.jar源码),与君共勉。

  1. package nio;
  2.  
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.nio.file.DirectoryStream;
  6. import java.nio.file.Files;
  7. import java.nio.file.Path;
  8. import java.text.ParseException;
  9. import java.text.SimpleDateFormat;
  10. import java.util.Calendar;
  11. import java.util.Date;
  12. import java.util.regex.Pattern;
  13.  
  14. public class FilesFilter {
  15. private static int maxDays = 0;
  16. private static String directory = "E:\\Program Files\\Apache Software Foundation\\Tomcat 8.5.24\\logs";
  17. private static String prefix = "localhost.";
  18. private static String suffix = ".log";
  19. private static Pattern pattern = null;
  20.  
  21. public static void main(String[] args) {
  22. // TODO Auto-generated method stub
  23. pattern = Pattern
  24. .compile("^(" + Pattern.quote(prefix) + ")\\d{4}-\\d{1,2}-\\d{1,2}(" + Pattern.quote(suffix) + ")$");
  25.  
  26. try {
  27. DirectoryStream<Path> files = streamFilesForDelete();
  28. System.out.println("准备输出:");
  29. for (Path file : files) {
  30. // Files.delete(file);
  31. System.out.println(file.toRealPath());
  32. }
  33. } catch (IOException e) {
  34. System.out.println("Unable to delete log files older than [" + maxDays + "] days");
  35. }
  36.  
  37. }
  38. /**
  39. * 查询过期文件
  40. * @return
  41. * @throws IOException
  42. */
  43. private static DirectoryStream<Path> streamFilesForDelete() throws IOException {
  44. final Date maxDaysOffset = getMaxDaysOffset();
  45. final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
  46. return Files.newDirectoryStream(new File(directory).toPath(), new DirectoryStream.Filter<Path>() {
  47. public boolean accept(Path path) throws IOException {
  48. boolean result = false;
  49. String date = obtainDateFromPath(path);
  50. if (date != null) {
  51. try {
  52. Date dateFromFile = formatter.parse(date);
  53. result = dateFromFile.before(maxDaysOffset);
  54. } catch (ParseException e) {
  55. // no-op
  56. }
  57. }
  58. return result;
  59. }
  60. });
  61. }
  62.  
  63. private static String obtainDateFromPath(Path path) {
  64. Path fileName = path.getFileName();
  65. if (fileName == null) {
  66. return null;
  67. }
  68. String date = fileName.toString();
  69. if (pattern.matcher(date).matches()) {
  70. date = date.substring(prefix.length());
  71. return date.substring(0, date.length() - suffix.length());
  72. } else {
  73. return null;
  74. }
  75. }
  76.  
  77. private static Date getMaxDaysOffset() {
  78. Calendar cal = Calendar.getInstance();
  79. cal.set(Calendar.HOUR_OF_DAY, 0);
  80. cal.set(Calendar.MINUTE, 0);
  81. cal.set(Calendar.SECOND, 0);
  82. cal.set(Calendar.MILLISECOND, 0);
  83. cal.add(Calendar.DATE, -maxDays);
  84. return cal.getTime();
  85. }
  86. }

  代码重点只有一个: java.nio.file.Files.newDirectoryStream(Path dir,DirectoryStream.Filter<? super Path> filter),nio的Files类下newDirectoryStream方法用于获取指定磁盘下的物理文件列表Stream,该方法第二个参数可接收一个用于过滤的功能函数。实现accept方法,针对自己的场景自定义过滤条件。个人理解这种方式,可以在一次磁盘扫描中,完成无效文件过滤与符合条件文件的获取操作。比起传统的io对文件逐个扫描的操作,可以减少磁盘读写开销,有助于软件性能提升。当然,没有做过试验,在我这里还不算是一个结论。有这方面性能验证的朋友,可以给我留言解惑,谢谢!

使用nio对磁盘下的文件进行过滤的更多相关文章

  1. Treeview显示磁盘下的文件,并且可操作

    #region TreeView树形显示磁盘下文件夹 /// <summary> /// IconIndexs类 对应ImageList中5张图片的序列 /// </summary& ...

  2. Linux系统下压缩文件时过滤指定的文件 |Linux系统压缩指定文件代码

    进入要压缩的目录: [root@iZ25c748tjqZ wechat]# cd /alidata1/htdocs/wechat/ 查看目录: [root@iZ25c748tjqZ wechat]# ...

  3. maven 过滤webapp下的文件

    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-p ...

  4. Linux:Day7(下) 磁盘管理、文件系统管理

    Linux入门 Linux系统管理: 磁盘管理.文件系统管理 RAID基本原理.LVM2 网络管理:TCP/IP协议.Linux网络属性配置 程序包管理:rpm,yum 进程管理:htop,glanc ...

  5. Java.io下的方法是对磁盘上的文件进行磁盘操作

    File类(java.io.*)可表示一个文件,也有可能是一个目录(在JAVA中文件和目录都属于这个类中,而且区分不是非常的明显). Java.io下的方法是对磁盘上的文件进行磁盘操作,但是无法读取文 ...

  6. 【JavaNIO的深入研究4】内存映射文件I/O,大文件读写操作,Java nio之MappedByteBuffer,高效文件/内存映射

    内存映射文件能让你创建和修改那些因为太大而无法放入内存的文件.有了内存映射文件,你就可以认为文件已经全部读进了内存,然后把它当成一个非常大的数组来访问.这种解决办法能大大简化修改文件的代码.fileC ...

  7. Linux下删除文件的原理

    Linux下文件删除的原理 Lniux下控制文件真正被删除的计数器 Linux是link的数量来控制文件删除的.只有当一个文件不存在任何link的时候,这个文件才会被删除.一般来讲,每个文件都有两个l ...

  8. CMD命令下对文件夹进行权限处理 转

    保证自己的磁盘分区格式是NTFS.FAT32是不行的. 一.Cacls.exe命令的使用 这是一个在Windows 2000/XP/Server 2003操作系统下都可以使用的命令,作用是显示或者修改 ...

  9. 【转发】du命令 实现Linux 某个文件夹下的文件按大小排序

    1. df -lh 2. du -s /usr/* | sort -rn这是按字节排序 3. du -sh /usr/* | sort -rn这是按兆(M)来排序 4.选出排在前面的10个du -s ...

随机推荐

  1. RequireJS(一)

    RequireJS: RequireJS中文网:http://www.requirejs.cn/ 解决HTML引入大量js文件导致的问题: 首先是加载的时候,浏览器会停止网页渲染,加载文件越多,网页失 ...

  2. 使用VSCode 编译调试QT程序

    预备知识 bat文件,或者其他的脚本语法. qmake基本语法,qmake shadow build是啥. vscode 的task,lanch的配置. 前提 各个程序正确安装,即使用QtCreato ...

  3. eclipes快捷键

    本文原创作者:pipi-changing 本文原创出处:http://www.cnblogs.com/pipi-changing/ Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D ...

  4. centos下配置sftp且限制用户访问目录[转]

    第一步:创建sftp服务用户组,创建sftp服务根目录 groupadd sftp #此目录及上级目录的所有者(owner)必须为root,权限不高于755,此目录的组最好设定为sftp mkdir ...

  5. python3 第十八章 - 迭代器与生成器

    1.迭代器(Iterator) 迭代是访问集合元素的一种方式 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 迭代器 ...

  6. 函数式编程--lambda表达式对比匿名内部类

    从前面的整理中我们看出了,Lambda表达式其实是匿名内部类的一种简化,因此它可以部分取代匿名内部类. 1,Lambda表达式与匿名内部类存在如下相同点: 1),Lambda表达式与匿名内部类一样,都 ...

  7. java 基本数据类型与变量类型

    Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. byte,short,char,int,long,float,double Java语言支持的变 ...

  8. java 网络编程之TCP通信和简单的文件上传功能

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  9. 如何用命令将本地项目上传到github

    一.Git终端软件安装 1.下载windows上git终端,类似shell工具,下载地址:http://msysgit.github.io/ 2.安装方法,打开文件,一路点击Next即可 3.安装完成 ...

  10. [PHP]PDO占位符预处理在 IN 和 LIKE 中用法

    两点注意项: 1. 占位符 (?) 必须被用在整个值的位置,不需要引号等其它字符. 2. 参数按数组元素顺序依次传递给占位符. <?php /** * PDO基于占位符的查询预处理 * * @l ...