使用 Java 读取 C 驱动器上每个文件的元数据和 MD5 哈希
Posted
技术标签:
【中文标题】使用 Java 读取 C 驱动器上每个文件的元数据和 MD5 哈希【英文标题】:Read Meta and an MD5 Hash For Every File On the C Drive Using Java 【发布时间】:2017-06-25 13:32:23 【问题描述】:我想知道是否有人可以帮助我。我只是在学习 Java,我想做的是读取 c:\ 上的每个文件并创建该文件的 md5 哈希以在稍后阶段进行比较以及显示一些基本计数和元数据。我似乎无法递归循环 c:\ 驱动器中的每个文件和文件夹,而且我不确定如何处理创建每个文件的 MD5 哈希。我也不确定这是处理这么多文件的最佳方法。
public static void main(String[] args) throws IOException
int FileCount = 0,
DirCount = 0,
HiddenFiles = 0,
HiddenDirs = 0;
File folder = new File("/");
File[] listOfFiles = folder.listFiles();
for (File listOfFile : listOfFiles)
Path file = listOfFile.toPath();
BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class);
System.out.println("creationTime: " + attr.creationTime());
System.out.println("lastAccessTime: " + attr.lastAccessTime());
System.out.println("lastModifiedTime: " + attr.lastModifiedTime());
System.out.println("isOther: " + attr.isOther());
System.out.println("isRegularFile: " + attr.isRegularFile());
System.out.println("isSymbolicLink: " + attr.isSymbolicLink());
System.out.println("size: " + attr.size());
if (listOfFile.isFile())
System.out.println("File " + listOfFile.getName());
System.out.println("isHidden " + listOfFile.isHidden());
if (listOfFile.isHidden())
HiddenFiles++;
System.out.println("getPath " + listOfFile.getPath());
FileCount++;
else if (listOfFile.isDirectory())
System.out.println("Directory " + listOfFile.getName());
System.out.println("isHidden " + listOfFile.isHidden());
System.out.println("getPath " + listOfFile.getPath());
if (listOfFile.isHidden())
HiddenDirs++;
DirCount++;
System.out.println("DirCount " + DirCount);
System.out.println("FileCount " + FileCount);
System.out.println("HiddenDirs " + DirCount);
System.out.println("HiddenFiles " + FileCount);
【问题讨论】:
【参考方案1】:让我们创建可以做你想做的事的类:
File, Folder
File
已经存在,让我们创建一个名为XFile
的类,虽然不好,但你会在未来找到更好的东西。
public class XFile
private final File file;
public XFile(File file)
this.file = file;
public String name()
return file.getName();
//other data you want to know, create getters for all wanted information from File.
public byte[] md5()
try (InputStream input = new BufferedInputStream(new FileInputStream(file)))
MessageDigest md5 = MessageDigest.getInstance("MD5");
int tempByte;
while ((tempByte = input.read()) != -1)
md5.update((byte) tempByte);
return md5.digest();
catch (IOException | NoSuchAlgorithmException e)
throw new RuntimeException(e);
和 Folder
类(应该一直在 jdk 中)
public class Folder
private final File underlyingDir;
private List<File> elements = null;
public Folder(File underlyingDir)
this.underlyingDir = underlyingDir;
private void fetchElements()
List<File> firstLevelElements = new ArrayList<>(Arrays.asList(underlyingDir.listFiles()));
elements = this.recursive(firstLevelElements, Integer.MAX_VALUE);
public List<XFile> files()
if (elements == null)
fetchElements();
return elements.stream()
.filter(File::isFile)
.map(XFile::new)
.collect(Collectors.toList());
public long foldersCount()
if (elements == null)
fetchElements();
return elements.stream()
.filter(File::isDirectory)
.collect(Collectors.toList())
.size();
public long filesCount()
if (elements == null)
fetchElements();
return elements.stream()
.filter(File::isFile)
.collect(Collectors.toList())
.size();
public long hiddenFiles()
if (elements == null)
fetchElements();
return elements.stream()
.filter(File::isFile)
.filter(File::isHidden)
.collect(Collectors.toList())
.size();
public long hiddenDirs()
if (elements == null)
fetchElements();
return elements.stream()
.filter(File::isDirectory)
.filter(File::isHidden)
.collect(Collectors.toList())
.size();
private List<File> recursive(List<File> elements, int depth)
if (depth == -1) return Collections.emptyList();
List<File> result = new ArrayList<>();
for (File element : elements)
if (element.isDirectory())
depth--;
result.add(element);
if (nonNull(element.listFiles()))
result.addAll(recursive(Arrays.asList(element.listFiles()), depth));
else
result.add(element);
return result;
和测试类Main
public class Main
public static void main(String[] args)
Folder folder = new Folder(new File("F:/"));
System.out.println("files " + folder.filesCount());
System.out.println("folders " + folder.foldersCount());
System.out.println("hidden dirs " + folder.hiddenDirs());
System.out.println("hidden files " + folder.hiddenFiles());
for (XFile file : folder.files())
System.out.printf("\nname: %s MD5 hash %s ", file.name(), Arrays.toString(file.md5()));
【讨论】:
以上是关于使用 Java 读取 C 驱动器上每个文件的元数据和 MD5 哈希的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.IllegalStateException:在使用 Spring Boot 实现开放 API 时无法读取类的元数据
是否可以使用 UDF 从 BigQuery 读取 gcs 对象的元数据
linux下find查找文件后使用xargs和exec进行删除压缩处理。