图片查找

import java.io.*;
import java.math.BigInteger;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Properties;/*** 读取一个图片MD5,和文件夹里的所有图片进行比较,返回相同的匹配信息* @author silence*/
public class MD5 {private static final HashMap<String, File> map = new HashMap<>();// 需要查找的图片路径,查找是否有HQ命名的图片private static File oneFile = new File("operate\\HQ");//配置文件路径private static File configFile = new File("operate\\HQ\\config.txt");//写入错误信息的文件路径private static File errorFile = new File("operate\\HQ\\run.txt");//被查找的图片文件路径private static File listFile = null;//统计查找次数的计数器private static int count = 1;/*** 传入一个文件流对象,读取MD5返回** @param file 文件流对象* @return 读取MD5返回* @throws IOException io异常*/private static String getMd5ByFile(File file) throws IOException {String md5Value = null;if (!file.canRead()) {return null;}try (FileInputStream in = new FileInputStream(file)) {MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());MessageDigest md5 = MessageDigest.getInstance("MD5");md5.update(byteBuffer);BigInteger bi = new BigInteger(1, md5.digest());md5Value = bi.toString(16);} catch (Exception e) {e.printStackTrace();}return md5Value;}/*** 主方法=============================================*/public static void main(String[] args) throws IOException {//在这里读取判断单个文件图片,是否有效String oneMd5 = getOneMd5(oneFile);//1.判断两个文件路径是否有效,无效退出if (!ioFile() || oneMd5 == null) {System.out.println("程序退出!!!");System.exit(1);}//2.被查找的图片文件路径,读取到mapgetFileMd5(listFile);System.out.println("文件读完成共读取" + count + "条信息....");//判断=======================Properties properties = new Properties();FileWriter writer = new FileWriter(errorFile);if (map.containsKey(oneMd5)) {//如果有符合条件的值,想配置文件写成功信息properties.setProperty("所匹配的文件名", map.get(oneMd5).getName());properties.setProperty("所匹配的文件路径", map.get(oneMd5).toString());properties.setProperty("所在文件夹路径", map.get(oneMd5).getParent());properties.setProperty("匹配成功,共匹配", count + "个文件信息");System.out.println("匹配成功,共匹配" + count + "个文件信息");} else {//如果没有符合条件的值,向配置文件写失败信息properties.setProperty("匹配失败,共匹配", count + "个文件信息");System.out.println("匹配失败,共匹配" + count + "个文件信息");}properties.store(writer, null);writer.close();System.out.println("程序正常结束");}/*** 读取需要查找文件的md5** @param oneFile 0* @return MD5*/private static String getOneMd5(File oneFile) throws IOException {//如果没有这个文件夹,返回nullif (!oneFile.canRead()) {return null;}File[] files = oneFile.listFiles();for (File f : files) {//需要是文件的String name = f.getName().split("\\.")[0];if (f.isFile() && "HQ".equals(name)) {return getMd5ByFile(f);}}//如果没有这个文件信息Properties p = new Properties();System.out.println("该文件没有名为HQ的图片信息,请把需要查找的图片改名为HQ,放到当前文件下");p.setProperty("程序结束", "该文件没有名为HQ的图片信息,请把需要查找的图片改名为HQ,放到当前文件下");FileWriter writer = new FileWriter(errorFile);p.store(writer, null);writer.close();return null;}/*** 判断是否存在配置文件,存在返回true 不存在,创建,返回false** @return 存在返回true 不存在,创建,返回false*/private static boolean ioFile() throws IOException {//判断文件配置路径是否存在,并且可读if (!configFile.canRead()) {System.out.println("配置文件不存在!!!即将创建一个空配置文件....");FileWriter writer = new FileWriter(configFile);Properties p = new Properties();p.setProperty("被查找的图片文件路径", "");p.store(writer, null);writer.close();  //关闭文件流return false;} else {String value1, value2;Properties p = new Properties();try (FileReader reader = new FileReader(configFile)) {System.out.println("配置文件存在,正在读取配置信息......");//读取配置文件p.load(reader);value1 = (String) p.get("被查找的图片文件路径");}System.out.println("正在判断文件路径是否为空....");if (value1 == null || "".equals(value1)) {System.out.println("文件路径为空!!!");return false;}if (!(new File(value1).canRead())) {System.out.println("文件路径无效!!!");return false;}listFile = new File(value1);System.out.println("图片路径有效进入下一步操作....");return true;}}/*** 读取所有文件,存储md5** @param file 文件* @throws IOException io异常*/private static void getFileMd5(File file) throws IOException {if (!file.canRead()) {//如果文件不可读,或不是正确的文件路径System.out.println("文件不可读,或不是正确的文件路径");return;}//返回此文件夹包含的所有文件try {File[] files = file.listFiles();assert files != null;for (File f : files) {//如果是一个文件,获取MD5存入到mapif (f.isFile()) {String md5 = getMd5ByFile(f);System.out.println("成功读取第" + count + "个");count++;map.put(md5, f);} else {getFileMd5(f);}}} catch (Exception e) {e.printStackTrace();}}}

================
1.在HQ文件夹内存入需要查找的HQ命名的图片
2.在HQ文件夹中config.txt 中填入需要查找的文件夹名(文件夹)
列:C:\Users\Administrator\Desktop\Demo小案例\共享文件夹\IEDA背景图片\img\新建文件夹 (2)
必须为双斜杠
3.点击启动,运行完成后信息会存入HQ文件夹下run.txt文件中

#Fri Apr 16 18:31:12 CST 2021
所在文件夹路径=D:\develop\jdk-11\conf\management
所匹配的文件路径=D:\develop\jdk-11\conf\management\jmxremote.access
匹配成功,共匹配=1943个文件信息
所匹配的文件名=jmxremote.access

#Fri Apr 16 17:30:46 CST 2021
被查找的图片文件路径=D:\develop
C:\Users\Administrator\Desktop\Demo小案例\共享文件夹\IEDA背景图片\img\新建文件夹 (2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/442759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Callable创建多线程

import java.util.concurrent.Callable;/*** author silence* Callable创建多线程* 创件一个类&#xff0c;实现 Callable 《》 这里填返回值类型* 重写call 方法。*/ public class MyCallable implements Callable<String> {Overridepublic String call() throws Exce…

继承Thread 创建多线程的简单实现

/*** 继承Thread 创建多线程的简单实现* author silence*/ public class MyThread extends Thread {Overridepublic void run() {for (int i 0; i < 100; i) {//打印当前线程对象名称System.out.print(getName() "----");System.out.println(i);}} } /** auth…

实现Runnable 创建多线程的简单实现

/*** 实现Runnable 创建多线程的简单实现** author silence*/ public class MyRunnable implements Runnable {Overridepublic void run() {for (int i 0; i < 100; i) {//打印当前线程名System.out.print(Thread.currentThread().getName() " ");System.out.p…

lambda表达式创建一条最简单的线程

/*** author silence*/ public class Demo1 {public static void main(String[] args) {new Thread(() -> {//打印线程名for (int i 0; i < 100; i) {System.out.println(Thread.currentThread().getName() " " i);}}).start();new Thread(() -> {//…

初学多线程使用中踩过的坑

wait使用&#xff0c;外面没有加synchronized &#xff0c;导致频繁报错。 IllegalMonitorStateException - 如果当前线程不是对象监视器的所有者报异常。 wait使用时会释放锁。并且使当前线程休眠&#xff0c;所以如果没有在synchronized 里面&#xff0c;没有获得锁。就会报错…

多线程线程池的基本创建,使用方法

import java.util.concurrent.*;/*** 多线程线程池的基本创建&#xff0c;使用方法** author silence*/ public class Silence {public static void main(String[] args) {//创建一个线程池 最大线程数量20 核心线程15//如果提交了超过15 不超过20的任务&#xff0c;会创建临时…

使用多线程拷贝文件夹

import java.io.*; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit;/*** 使用多线程拷贝文件夹* 不考虑目的地文件的唯一性。 不按源文件格…

javase 的一些基础常用类

/*** author silence* javase 的一些基础常用类*/ public class Silence1 {public static void main(String[] args) { // Obect equals hashcode // Arrays toString sort binarySearch 输出数组 排序 查找 // Objects nonNull isNull 对对象的…

UDP 通讯协议 局域网通信发送消息 简单实现

发送端 import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner;/*** UDP 通讯协议 局域网通信发送消息 简单实现 发送端** author silence*/ public class SendDemo {public static void main(String[] arg…

TCP局域网 通讯 的消息发送

import java.io.*; import java.net.ServerSocket; import java.net.Socket;/*** 初学者TCP局域网 通讯 的消息发送* TCP 服务器* 必须先 打开服务器才能 打开客户端建立连接** author silence*/ public class TcpInput {public static void main(String[] args) throws IOE…

基于多线程的TCP局域网通信,客户端向服务端上传 文件简单实现源码

客户端 import java.io.*; import java.net.Socket;/*** ### 作业3&#xff1a;* 完成文件上传案例学习* - 案例需求* 客户端&#xff1a;数据来自于本地文件&#xff0c;接收服务器反馈* 服务器&#xff1a;接收到的数据写入本地文件&#xff0c;给出反馈* - 案例分析* - 创建…

多线程完成连续打印1-100的数字, 要求一条线程专门打印奇数,另外一条专门用来打印偶数

import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit;/*** ### 作业5&#xff1a;* 请利用线程间通信, 完成连续打印1-100的数字, 要求一条线程专…

通过反射获得类的构造引用无视private修饰符

import operate327.Demo; import operate425.demo.demo1.Student;import java.lang.reflect.Constructor;/*** 通过反射获得类的构造引用无视private修饰符** author silence*/ public class ClassConstructor {public static void main(String[] args) throws Exception {//获…

通过反射突破private访问修饰符获取私有和公共的属性,设置和获取值

import operate425.demo.demo1.Student;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException;/*** 通过反射突破private访问修饰符获取私有和公共的属性&#xff0c;设置和获取值** author silence*/ …

通过反射突破访问修饰符,调用private私有的方法

import operate425.demo.demo1.Student;import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;/*** 通过反射突破访问修饰符&#xff0c;调用private私有的方法** author silence*/ public class Clas…

ArrayList单列集合的简单使用常见方法

import java.util.ArrayList; import java.util.Iterator;/*** ArrayList单列集合的简单使用常见方法** author silence* 单列 &#xff1a;一次只能存储一个数据元素 list.add("张三"); 不像map集合可以存储一个键值对&#xff0c;两个元素 map.put("张三&quo…

使用三种方式创建Class字节码类文件对象

/*** 使用三种方式创建Class字节码类文件对象** author silence*/ public class Demo1 {public static void main(String[] args) throws Exception {Class<?> clazz1 Class.forName("operate425.operate.operate1.Demo1");Class<?> clazz2 Demo1.cl…

通过反射获得私有构造器,创建对象

import java.lang.reflect.Constructor;/*** 通过反射获得私有构造器&#xff0c;创建对象** author silence*/ public class Demo1 {public static void main(String[] args) throws Exception {//获得字节码文件Class<User> userClass User.class;//获得私有化构造方法…

通过反射创建私有化构造的类,并为私有化属性复制。调用私有化方法

import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;/*** 通过反射创建私有化构造的类&#xff0c;并为私有化属性复制。调用私有化方法** author silence*/ public class Demo1 {public static void main(String[] args…

日期时间类解析指定格式字符串日期 转换为自己想要的日期时间格式

import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor;/*** 日期时间类解析指定格式字符串日期 转换为自己想要的日期时间格式** author silence*/ public class Silence {public static void main(String[] args) {//…