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

package nio;

import java.io.File;
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Pattern; public class FilesFilter {
private static int maxDays = 0;
private static String directory = "E:\\Program Files\\Apache Software Foundation\\Tomcat 8.5.24\\logs";
private static String prefix = "localhost.";
private static String suffix = ".log";
private static Pattern pattern = null; public static void main(String[] args) {
// TODO Auto-generated method stub
pattern = Pattern
.compile("^(" + Pattern.quote(prefix) + ")\\d{4}-\\d{1,2}-\\d{1,2}(" + Pattern.quote(suffix) + ")$"); try {
DirectoryStream<Path> files = streamFilesForDelete();
System.out.println("准备输出:");
for (Path file : files) {
// Files.delete(file);
System.out.println(file.toRealPath());
}
} catch (IOException e) {
System.out.println("Unable to delete log files older than [" + maxDays + "] days");
} }
/**
* 查询过期文件
* @return
* @throws IOException
*/
private static DirectoryStream<Path> streamFilesForDelete() throws IOException {
final Date maxDaysOffset = getMaxDaysOffset();
final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
return Files.newDirectoryStream(new File(directory).toPath(), new DirectoryStream.Filter<Path>() {
public boolean accept(Path path) throws IOException {
boolean result = false;
String date = obtainDateFromPath(path);
if (date != null) {
try {
Date dateFromFile = formatter.parse(date);
result = dateFromFile.before(maxDaysOffset);
} catch (ParseException e) {
// no-op
}
}
return result;
}
});
} private static String obtainDateFromPath(Path path) {
Path fileName = path.getFileName();
if (fileName == null) {
return null;
}
String date = fileName.toString();
if (pattern.matcher(date).matches()) {
date = date.substring(prefix.length());
return date.substring(0, date.length() - suffix.length());
} else {
return null;
}
} private static Date getMaxDaysOffset() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.add(Calendar.DATE, -maxDays);
return cal.getTime();
}
}

  代码重点只有一个: 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. CCF系列之有趣的数(201312-4)

    题目链接: http://115.28.138.223:81/view.page?opid=4 试题名称: 有趣的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 我们把一个 ...

  2. 我的踩坑之旅-代码不规范引发的“bug”

    今早公司上班,老大跟我说有一个服务老是上线,下线,问我啥情况.我回想了下我的项目部署,觉得不可能会出现这个问题呀.然后各种鼓捣,倒腾了一个早上,终于找出了罪魁祸首. 场景:我们的服务部署在亚马逊上.我 ...

  3. phpmailer发送邮件服务

    获取开源的phpmail类 开启stmp服务登录126/163邮箱 ->设置->POPS/SMTP/IMAP(开启需要的服务,并点击保存,初次使用会要求设置一个授权码) 测试 <?p ...

  4. 【转】高精度GPS测量中框架基准的统一

    一.地面基准点的坐标基准转换 一般情况下,我们可以从IERS或IGS等机构获取最新的站坐标和速度场,这些站坐标和速度场是在某一特定基准框架和历元下的坐标值,若要提供高精度GPS网的分析使用,还需要作框 ...

  5. Go语言学习索引

    <Go并发编程实战>示例项目 项目地址: https://github.com/hyper-carrot/goc2p 项目安装: 用git clone获取项目,并将其根目录作为一个工作区. ...

  6. GitHub For Beginners: Commit, Push And Go

    In Part 1 of this two-part GitHub tutorial, we examined the main uses for GitHub and bega5n the proc ...

  7. Opensshd 源码升级

    OPenssh 下载地址: http://www.openssh.com/ 以下步骤 OS: 6.x  安装Opensshd 7.4p1 验证通过 6.8  安装Opensshd 7.6p1 验证通过 ...

  8. [DeeplearningAI笔记]ML strategy_1_3可避免误差与改善模型方法

    机器学习策略 ML strategy 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.8 为什么是人的表现 今天,机器学习算法可以与人类水平的表现性能竞争,因为它们在很多应用程序中更有生产 ...

  9. 15_Python函数名本质

    函数名的本质 函数名实质上就是函数的内存地址 def wrapper(): pass print(wrapper) 1.引用是什么? 当我们定义a=1的时候,系统会开辟一块内存空间来保存1,然后用a变 ...

  10. ASP.NET MVC 5 ABP DataTables (二)

    1)ABP DataTables 应用(一) 2)  ABP DataTables 应用(二) JS DataTables 这个组件绑定数据必须要有自己的返回数据格式.但是ABP返回的格式直接绑定是错 ...