删除第一行后,您的代码可以正常工作。然后它会打印一个包含完整路径的文件列表。
如果您还想打印 MD5 和,您可以从您引用的代码中选择相关部分。这不是太多,因为你已经在循环中有 File 对象,所以你需要单行与 md5 的东西:
public static void listFilesAndFilesSubDirectories(String directoryName){
File directory = new File(directoryName);
//get all the files from a directory
File[] fList = directory.listFiles();
for (File file : fList){
if (file.isFile()){
System.out.print(file.getAbsolutePath());
try(FileInputStream fis=new FileInputStream(file)){
System.out.println(" - MD5: "+DigestUtils.md5Hex(IOUtils.toByteArray(fileInputStream)));
}catch(Exception ex){
System.out.println(" - Error: "+ex);
}
} else if (file.isDirectory()){
listFilesAndFilesSubDirectories(file.getAbsolutePath());
}
}
}
因为我不太喜欢对外部库的依赖,尤其是它会将整个文件加载到内存中(toByteArray 调用表明这一点),所以这里是第一个 if 的替代品,没有 Apache Commons 并且没有将整个文件加载到数组中,但需要一个 throws NoSuchAlgorithmException 作为方法头或一个额外的 try-catch 某处:
...
if (file.isFile()){
System.out.print(file.getAbsolutePath());
try(DigestInputStream dis=new DigestInputStream(new BufferedInputStream(new FileInputStream(file)), MessageDigest.getInstance("MD5"))){
while(dis.read()>=0);
System.out.println(" - MD5: "+javax.xml.bind.DatatypeConverter.printHexBinary(dis.getMessageDigest().digest()));
}catch(Exception ex){
System.out.println(" - Error: "+ex);
}
} else if (file.isDirectory()){
...
或者一个不抛出异常并且不依赖于javax的长的东西(毕竟不一定存在):
...
if (file.isFile()){
System.out.print(file.getAbsolutePath());
MessageDigest md5=null;
try{md5=MessageDigest.getInstance("MD5");}catch(NoSuchAlgorithmException nsae){};
try(DigestInputStream dis=new DigestInputStream(new BufferedInputStream(new FileInputStream(file)), md5)){
while(dis.read()>=0);
System.out.print(" - MD5: ");
for(Byte b: md5.digest())
System.out.printf("%02X",b);
System.out.println();
}catch(IOException ioe){
System.out.println(" - Error: "+ioe);
}
} else if (file.isDirectory()){
...
这是我用于测试的实际代码 (RecDir.java),现在修改为 c:\(其中包括处理您无权访问的目录的额外检查):
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class RecDir {
public static void main(String[] args) {
listFilesAndFilesSubDirectories("c:\\");
}
public static void listFilesAndFilesSubDirectories(String directoryName){
File directory = new File(directoryName);
//get all the files from a directory
File[] fList = directory.listFiles();
if(fList!=null)
for (File file : fList){
if (file.isFile()){
System.out.print(file.getAbsolutePath());
MessageDigest md5=null;
try{md5=MessageDigest.getInstance("MD5");}catch(NoSuchAlgorithmException nsae){};
try(DigestInputStream dis=new DigestInputStream(new BufferedInputStream(new FileInputStream(file)), md5)){
while(dis.read()>=0);
System.out.print(" - MD5: ");
for(Byte b: md5.digest())
System.out.printf("%02x",b);
System.out.println();
}catch(IOException ioe){
System.out.println(" - Error: "+ioe);
}
} else if (file.isDirectory()){
listFilesAndFilesSubDirectories(file.getAbsolutePath());
}
}
}
}
我只是直接从 NetBeans/Eclipse 项目文件夹中运行它(这是硬编码 "." 的结果),然后它列出了子目录中的各种项目文件、.java 文件本身等。