在 java 中获取文件路径作为字符串

Get filepath as string in java

我尝试了一千多次,但我想不出一种方法来 return 所有文件路径作为一个字符串,仅作为一个列表。例如,我希望名为 filePath 的字符串为 return c:/users/exampleuser/file.txt 但对于目录及其子目录中的所有文件。

public void listFilesAndFilesSubDirectories(String directoryName){
     directoryName = "C:\";
    File directory = new File(directoryName);
    //get all the files from a directory
    File[] fList = directory.listFiles();
    for (File files : fList){
        if (files.isFile()){
            System.out.println(files.getAbsolutePath());
        } else if (files.isDirectory()){
            listFilesAndFilesSubDirectories(files.getAbsolutePath());
        }
    }
}

这是我试过的示例代码,但 return 什么都没有。我需要 return 文件路径作为字符串,因为我试图使用 this 方法获取 md5。

提前致谢。

您可以使用 Files 以简单的方式实现它:

public List<String> listFilesAndFilesSubDirectories(String directoryName) throws IOException {
      return Files.walk(Paths.get(directoryName))
        .map(Path::toFile)
        .map(File::getAbsolutePath)
        .collect(Collectors.toList());
}

您的代码在删除第一行后工作正常。然后它打印一个文件列表,带有完整路径。

如果您还想打印 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 文件本身等