前述和需求说明

  和之前写的 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. JAVA库函数总结【持续更新】

    生成随机数: Math.random()是令系统随机选取大于等于 0.0 且小于 1.0 的伪随机 double 值. Random rand = newRandom(); rand.nextInt( ...

  2. 一天搞懂深度学习-训练深度神经网络(DNN)的要点

    前言 这是<一天搞懂深度学习>的第二部分 一.选择合适的损失函数 典型的损失函数有平方误差损失函数和交叉熵损失函数. 交叉熵损失函数: 选择不同的损失函数会有不同的训练效果 二.mini- ...

  3. java运行机制、Jdk版本及Java环境变量

    一.语言特性 计算机高级语言按程序的执行方式可分为:编译型和解释型两种.编译型的语言是指使用专门的编译器,针对特定的平台(操作系统)一次性翻译成被该平台硬件执行的机器码,并包装成该平台可执行性程序文件 ...

  4. CSS——LESS【转】

    原文链接:http://www.w3cplus.com/css/less 去年就初次接触了LESS,并用他制作了一个Less.org的首页页面,但由于CSS的固有模式,没有让自己喜欢上他.由于前段时间 ...

  5. 【转】Python的下划线

    原文: 1. Python中的下划线(译文) 2. [转]关于python中带下划线的变量和函数的意义 总结: 1. 单下划线开头.保护变量,不可被其他包导入使用,除非在__all__声明可以显示引用 ...

  6. Struts2文件上传--多文件上传(插件uploadify)

    公司需要把以前的Struts2自带的图片上传替换掉,因为不能一个file选择多个文件,本人直接百度搜索图片插件,  貌似就它(uploadify3.2.1)在最前面,也找过很多案例, 其中有不少问题, ...

  7. 【转】maven跳过单元测试-maven.test.skip和skipTests的区别

    -DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下. -Dmaven.test.skip=true,不执行测试用例,也不编译测试 ...

  8. sap 内表

    内表的目的在ABAP/4中,主要使用表格.表格是R/3系统中的关键数据结构.长期使用的数据存储在关系数据库表格中.关于如何读取和处理数据库表格的详细信息,参见读取并处理数据库表.除了数据库表格,还可以 ...

  9. valueOf函数详解

    在类型转换中,经常用到方法valueOf()和他toString(),所有对象(包括基本包装类型)都拥有这两个方法.这篇文章我们先看看valueOf()方法.valueOf()方法会将对象转换为基本类 ...

  10. IE8中marquee不显示出滚动效果的解决办法

    随着各种软件的升级,我们系统中的IE6也渐渐被淘汰了,目前主流的浏览器一半的用户已经从IE6直接升级到了IE8,虽然给用户更好的体验,上网更快更方便了,但是对网站制作来说,又是个比较麻烦的问题,因为很 ...