掃描某目錄下的所有文件的MD5碼並導出文件【可執行jar】
阿新 • • 發佈:2017-11-17
output clean mvn clean hot sts balance tid eat .get
pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>geostack</groupId> <artifactId>geostack-md5</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.10</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.0.0</version> <configuration> <archive> <manifest> <mainClass>com.nihaorz.util.md5.MD5Util</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> </plugins> </build> </project>
MD5Util.java
package com.nihaorz.util.md5; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.IOUtils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; public class MD5Util { public static void main(String[] args) { String[] _args = new String[]{ "D:\\.m2\\repository\\geostack\\geostack-balance-core\\2.0.0.0-SNAPSHOT", "md5", "D:\\Nihaorz\\Desktop\\md5.txt" }; run(args); } private static void run(String[] args) { if (args == null || args.length == 0) { System.out.println("該jar文件功能為打印或導出某單個文件或者某個目錄下所有文件的的MD5碼"); System.out.println("第一個參數【必填】為文件路徑或文件夾路徑"); System.out.println("第二個參數【必填】為排序規則,name:以文件名升序,md5:以md5碼升序"); System.out.println("第三個參數【選填】為導出文件路徑,配絕對地址,包含文件名,不存在時自動創建,不填時數據將只打印在控制臺"); } else { if (args.length >= 2) { System.out.println("文件掃描中......"); System.out.println("---------------------------------------------------------------------------"); String path = args[0]; File file = new File(path); if (file.exists()) { String sort = args[1]; if ("name".equalsIgnoreCase(sort) || "md5".equalsIgnoreCase(sort)) { Long time = null; long start = System.currentTimeMillis(); Map<String, File> map = getMD5ByPath(file); Map<String, String> map1 = new HashMap<String, String>(); StringBuilder sb = new StringBuilder(); if (map.size() > 0) { List<String> list = new ArrayList<String>(); Iterator<String> it = map.keySet().iterator(); while (it.hasNext()) { String md5 = it.next(); map1.put(map.get(md5).getName(), md5); if ("name".equalsIgnoreCase(sort)) { list.add(map.get(md5).getName()); } else if ("md5".equalsIgnoreCase(sort)) { list.add(md5); } } String[] strings = new String[list.size()]; strings = list.toArray(strings); Arrays.sort(strings, String.CASE_INSENSITIVE_ORDER); if ("name".equalsIgnoreCase(sort)) { for (String string : strings) { sb.append(map1.get(string)).append(" -- ").append(string).append("\n"); System.out.println(map1.get(string) + " -- " + string); } } else if ("md5".equalsIgnoreCase(sort)) { for (String string : strings) { sb.append(string).append(" -- ").append(map.get(string).getName()).append("\n"); System.out.println(string + " -- " + map.get(string).getName()); } } System.out.println("---------------------------------------------------------------------------"); System.out.println("掃描路徑:" + args[0]); System.out.println("掃描文件總數:" + map.size()); time = System.currentTimeMillis() - start; } if (time != null) { System.out.println("掃描耗時:" + time + "毫秒"); } else { long end = System.currentTimeMillis(); System.out.println("掃描耗時:" + (end - start) + "毫秒"); } if (args.length >= 3) { String outPath = args[2]; File outFile = new File(outPath); if (!outFile.exists()) { try { outFile.createNewFile(); } catch (IOException e) { System.out.println("文件創建失敗,請檢查導出路徑配置!"); } } FileOutputStream fos = null; try { fos = new FileOutputStream(outFile); } catch (FileNotFoundException e) { e.printStackTrace(); } PrintWriter pw = new PrintWriter(fos); StringBuilder result = new StringBuilder(); result.append("掃描路徑:").append(args[0]).append("\n") .append("掃描文件總數:").append(map.size()).append("\n") .append("掃描耗時:").append(time).append("毫秒").append("\n") .append("導出文件:").append(args[2]).append("\n") .append("---------------------------------------------------------------------------\n") .append(sb); pw.write(result.toString().toCharArray()); pw.flush(); pw.close(); System.out.println("導出文件:"+args[2]); } } else { System.out.println("排序規則不合法!"); } } else { System.out.println("文件路徑或文件夾路徑不存在!"); } } } } /** * 獲取某指定文件或某目錄下的文件的MD5碼map * * @param path * @return */ private static Map<String, File> getMD5ByPath(File path) { Map<String, File> result = new HashMap<String, File>(); if (path.exists()) { if (path.isDirectory()) { File[] files = path.listFiles(); for (File file : files) { try { if (!file.isDirectory()) { String md5 = DigestUtils.md5Hex(IOUtils.toByteArray(new FileInputStream(file))); result.put(md5, file); } } catch (IOException e) { e.printStackTrace(); } } } else { try { String md5 = DigestUtils.md5Hex(IOUtils.toByteArray(new FileInputStream(path))); result.put(md5, path); } catch (IOException e) { e.printStackTrace(); } } } return result; } }
進到項目根目錄下執行
mvn clean compile assembly:single
然後到target目錄找到以-jar-with-dependencies.jar結尾的jar文件,即可以使用java -jar命令執行
以下為附件,解壓可用:
geostack-md5-1.0-SNAPSHOT-jar-with-dependencies.jar.zip
掃描某目錄下的所有文件的MD5碼並導出文件【可執行jar】