上篇博文讲到为了解决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. 使用 IDEA和Maven 整合SSH框架

    1.创建web工程 一路next 下去就行.完成后,IDEA会自动构建maven工程. 2.创建如下项目结构 需要将 java文件夹设置为SourcesRoot目录,否则无法创建package 设置操 ...

  2. win7 mysql 数据库轻松实现数据库定时备份

    本地备份: 第一步: 安装一个mysql. 第二步: 在命令行中配置mysql 打开环境变量将mysql 安装路径配置到path中 第三部: cmd 中输入:mysqldump -uroot -p12 ...

  3. sersync+rsync同步

    (一)目标服务器(rsync):10.60.50.192 1.安装rsync yum -y install rsync 2.创建rsyncd.conf配置文件 vi /etc/rsyncd.conf ...

  4. ECLIPS-S测井系统下的仪器挂接 [CV模块]

    常见简写 简写 全拼 含义 CV Calibration and Verification 刻度和校验 CP Primary Calibration 主刻度 VP Primary Verify 主校验 ...

  5. js 抛物线 笔记备份

    var funParabola = function(element, target, options) { /* * 网页模拟现实需要一个比例尺 * 如果按照1像素就是1米来算,显然不合适,因为页面 ...

  6. PHP实现QQ登录的开发教程

    第三方登录,就是使用大家比较熟悉的比如QQ.微信.微博等第三方软件登录自己的网站,这可以免去注册账号.快速留住用户的目的,免去了相对复杂的注册流程.下边就给大家讲一下怎么使用PHP开发QQ登录的功能. ...

  7. Docker之容器

    容器(Container) 容器介绍: docker是通过容器来运行业务的,就像运行一个kvm虚拟机是一样的.容器其实就是从镜像创建的一个实例. 我们可以对容器进行增删改查,容器之间也是相互隔离的.和 ...

  8. Linux 下定时备份数据库以及删除缓存

    一.定时备份数据库 1.在根目录下创建备份文件夹 #mkdir backup 2.进入到该目录下,创建backup.sh文件 3.赋予文件权限让其变成可执行文件 4.在backup.sh中写备份的脚本 ...

  9. MySQL死锁案例分析与解决方案

    MySQL死锁案例分析与解决方案 现象: 数据库查询: SQL语句分析:  mysql. 并发delete同一行记录,偶发死锁.   delete from x_table where id=?   ...

  10. 夏令营讲课内容整理 Day 2.

    本日主要内容是并查集和堆. 并查集 并查集是一种树型的数据结构,通常用来处理不同集合间的元素之间的合并与查找问题.一个并查集支持三个基本功能:合并.查找和判断.举一个通俗的例子,我和lhz认识,lhz ...