前述和需求说明

  和之前写的 Python:基于MD5的文件监听程序 是同样的功能,就不啰嗦了,就是又写了一个java版本的,可以移步 python 版本去看一下,整个的核心思路是一样的。代码已上传Github

类说明

  FileMd5.java 利用md5生成文件hash值
  fileWalk.java 只是一个文件遍历的demo,没有被其他类调用
  myFileListener.java 主程序,监控文件夹,用到了文件遍历,调用了FileMd5中的FileMd5类

代码

FileMd5.java

 package myFileListener;

 import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.FileInputStream;
import java.io.IOException; public class FileMd5 {
public static String fileMd5(String inputFile) throws IOException{ int bufferSize = 1024*1024; //缓冲区大小
FileInputStream fileInputStream = null;
DigestInputStream digestInputStream = null; try {
//获取MD5的实例
MessageDigest messageDigest = MessageDigest.getInstance("MD5"); fileInputStream = new FileInputStream(inputFile); digestInputStream = new DigestInputStream(fileInputStream, messageDigest); //Creates a digest input stream, using the specified input stream and message digest. byte[] buffer = new byte[bufferSize]; //设置缓冲区,辅助读取文件,避免文件过大,导致的IO开销
while(digestInputStream.read(buffer)>0); //read: updates the message digest return int
// 获取最终的MessageDigest
messageDigest = digestInputStream.getMessageDigest();
// 拿到结果 return字节数组byte[] 包含16个元素
byte[] resultByteArray = messageDigest.digest(); return byteArrayToHex(resultByteArray); //转换byte 为 string 类型 }catch(NoSuchAlgorithmException e) {
return null;
}finally {
try {
digestInputStream.close();
fileInputStream.close();
}catch (Exception e) {
System.out.println(e);
}
}
} public static String byteArrayToHex(byte[] byteArray){
char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
//一个字节是八位二进制 也就是2位十六进制字符
char[] resultCharArray = new char[byteArray.length*2]; int index = 0;
for(byte b : byteArray){
resultCharArray[index++] = hexDigits[b>>> 4 & 0xf];
resultCharArray[index++] = hexDigits[b& 0xf];
}
return new String(resultCharArray);
}
}

myFileListener.java

 package myFileListener;

 import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import myFileListener.FileMd5; /**
* @author jyroo
* myfilelistener
*/
@SuppressWarnings("unused")
public class myFileListener {
HashMap<String, String> hashmap = new HashMap<>(); //存放hash键值对
List<String> file_in = new ArrayList<String>();
List<String> file_ex = new ArrayList<String>();
@SuppressWarnings("static-access")
public void iteratorPath(String dir, List<String> file_in, List<String> file_ex) {
while(true) {
List<String> pathName = new ArrayList<String>(); //存放文件名
File file = new File(dir);
File[] files = file.listFiles(); //返回某个目录下所有文件和目录的绝对路径 return file[]
if(files != null) {
for(File each_file : files) {
if(each_file.isFile()) { // 如果是文件
int jui=2, juj=2;
if(file_in.size()!=0) {
jui = 0;
for(String strin : file_in) {
if(each_file.getName().indexOf(strin)==-1) {
jui = 0;
}
if(each_file.getName().indexOf(strin)!=-1) {
jui = 1;
}
}
}
if(file_ex.size()!=0) {
juj = 0;
for(String strex : file_ex) {
if(each_file.getName().indexOf(strex)!=-1) {
juj = 1;
}
}
if(juj==1||jui==0) {
continue;
}
pathName.add(each_file.getName()); //存储文件名 String file_path = each_file.getAbsolutePath(); //获取文件的绝对路径 try {
FileMd5 mymd5 = new FileMd5();
String md5_value = mymd5.fileMd5(file_path); //生成文件对应的hash值
if(hashmap.get(each_file.getName())==null) {
System.out.println("文件夹:" + dir + "中的文件:" + each_file.getName() + "为新建文件!时间为:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
hashmap.put(each_file.getName(), md5_value); //以文件名作为key,hash值作为value存储到hashmap中
}
if(!hashmap.get(each_file.getName()).equals(md5_value)) {
System.out.println("文件夹:" + dir + "中的文件:" + each_file.getName() + "被更新!时间为:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
hashmap.put(each_file.getName(), md5_value);
}
} catch (Exception e) {
System.out.println("发生 "+e+" 的错误!!时间为" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
// }else if(each_file.isDirectory()) { //如果是文件夹
// //iteratorPath(each_file.getAbsolutePath()); //递归遍历
// }
}
}
try {
int juk;
for(String key : hashmap.keySet()) {
if(!pathName.contains(key)) {
System.out.println("文件夹:" + dir + "中的文件:" + key + "的文件已被删除!时间为:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
hashmap.remove(key);
}
}
}catch(Exception e) {
System.out.println(e);
}
}
}
} public static void main(String[] args) {
myFileListener file_walk = new myFileListener();
List<String> file_ex = new ArrayList<String>();
List<String> file_in = new ArrayList<String>();
file_ex.add(".rec");
//file_in.add("hi");
file_walk.iteratorPath("E:\\tmp\\", file_in, file_ex);
for(String key:file_walk.hashmap.keySet()){
System.out.println("Key: "+key+" Value: "+file_walk.hashmap.get(key));
}
} }

fileWalk.java

package myFileListener;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test; @SuppressWarnings("unused")
public class fileWalk {
List<String> pathName = new ArrayList<String>();
public void iteratorPath(String dir) {
File file = new File(dir);
File[] files = file.listFiles(); //listFiles是获取该目录下所有文件和目录的绝对路径 return file[]
if(files != null) {
for(File each_file : files) {
if(each_file.isFile()) {
pathName.add(each_file.getName());
}else if(each_file.isDirectory()) {
iteratorPath(file.getAbsolutePath());
}
}
}
} public static void main(String[] args) {
fileWalk file_walk = new fileWalk();
file_walk.iteratorPath("E:\\tmp\\");
for(String list : file_walk.pathName) {
System.out.println(list);
}
}
}

Java:基于MD5的文件监听程序的更多相关文章

  1. Python:基于MD5的文件监听程序

    前述 写了一个基于MD5算法的文件监听程序,通过不同的文件能够生成不同的哈希函数,来实现实现判断文件夹中的文件的增加.修改.删除和过滤含有特定字符的文件名的文件. 需求说明 需要实现对一个文件夹下的文 ...

  2. 一个基于Socket的http请求监听程序实现

    首先来看以下我们的需求: 用java编写一个监听程序,监听指定的端口,通过浏览器如http://localhost:7777来访问时,可以把请求到的内容记录下来,记录可以存文件,sqlit,mysql ...

  3. 涂抹Oracle笔记1-创建数据库及配置监听程序

    一.安装ORACLE数据库软件及创建实例OLTP:online transaction processing 指那些短事务,高并发,读写频繁的数据库系统.--DB_BLOCK_SIZE通常设置较小.O ...

  4. 监听程序未启动或数据库服务未注册到该监听程序。启动该监听程序并注册数据库服务 然后重新运行 em configuration assistant。

    在WIN 7/64Bit上安装ORACLE 11gR2后,管理网页Database Control(如:https://localhost:1158/em)始终登录不进去,总是说密码错误,使用配置工具 ...

  5. (转)oracle 启动监听 报“监听程序不支持服务” 解决

    转自 http://www.51testing.com/html/99/478599-842622.html 今天安装了oracle后,启动监听,报错如下:    启动tnslsnr: 请稍候... ...

  6. (转)ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法

    早上同事用PL/SQL连接虚拟机中的Oracle数据库,发现又报了"ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务"错误,帮其解决后,发现很多人遇到过这样的问 ...

  7. (转)解决 ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务

    下面操作默认在安装Oralce数据库的服务器上运行. 1)确保Oracle 基本服务都已启动 OracleDBConsoleorcl OracleOraDb11g_home1TNSListener O ...

  8. ORA-12523: TNS: 监听程序无法找到适用于客户机连接的例程

    今天使用PL/SQL Developer连接到一台新的测试服务器时,遇到ORA错误:ORA-12523: TNS: 监听程序无法找到适用于客户机连接的例程.对应的监听日志文件里面错误为TNS-1252 ...

  9. Oracle几个基础配置问题:ORA-12154: TNS: 无法解析指定的连接标识符、ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务、ORA-12516 TNS监听程序找不到符合协议堆栈要求的可用处理程序

    问题1:ORA-12154: TNS: 无法解析指定的连接标识符 在一台服务器上部署了Oracle客户端,使用IP/SID的方式访问,老是报ORA-12154错误,而使用tnsnames访问却没有问题 ...

随机推荐

  1. 利用分支限界法求解单源最短路(Dijkstra)问题

    分支限界法定义:采用Best fist search算法,并使用剪枝函数的算法称为分支界限法. 分支限界法解释:按Best first的原则,有选择的在其child中进行扩展,从而舍弃不含有最优解的分 ...

  2. springmvc 请求经过controller后静态资源无法访问的问题

    经过RequestMapping(“xx”)后 转发请求时会在url里面附带地址, 导致访问静态资源文件失败, 解决办法是在 spring-mvc.xml文件中加上 <mvc:default-s ...

  3. Python并发编程之线程中的信息隔离(五)

    大家好,并发编程 进入第三篇. 上班第一天,大家应该比较忙吧.小明也是呢,所以今天的内容也很少.只要几分钟就能学完. 昨天我们说,线程与线程之间要通过消息通信来控制程序的执行. 讲完了消息通信,今天就 ...

  4. CentOS7 安装 MySQL

    一.首先检查 MySQL 是否已安装 yum list installed | grep mysql 如果有的话 就全部卸载 yum -y remove +数据库名称 二.MySQL 依赖 libai ...

  5. java并发之ReentrantLock学习理解

    简介 java多线程中可以使用synchronized关键字来实现线程间同步互斥,但在jdk1.5中新增加了ReentrantLock类也能实现同样的效果,并且在扩展功能上也更加强大,比如具有嗅探锁定 ...

  6. Jmeter运行后出现乱码

    1.响应结果出现乱码一般是编码的问题,汉子乱码在编码处编码写成utf-8 2.如果还不行,对jmeter的文件进行修改.具体修改方法参考https://blog.csdn.net/liu5781821 ...

  7. vue学习之响应式原理的demo实现

    Vue.js 核心: 1.响应式的数据绑定系统 2.组件系统. 访问器属性 访问器属性是对象中的一种特殊属性,它不能直接在对象中设置,而必须通过 defineProperty() 方法单独定义. va ...

  8. 连接Redis后执行命令错误 MISCONF Redis is configured to save RDB snapshots

    今天在redis中执行setrange name 1 chun 命令时报了如下错误提示: (error) MISCONF Redis is configured to save RDB snapsho ...

  9. Python configparser 读取指定节点内容失败

    # !/user/bin/python # -*- coding: utf-8 -*- import configparser # 生成一个config文件 config = configparser ...

  10. search_request.go

    package types type SearchRequest struct {     // 搜索的短语(必须是UTF-8格式),会被分词     // 当值为空字符串时关键词会从下面的Token ...