在 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 文件本身等
我尝试了一千多次,但我想不出一种方法来 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 文件本身等