Java-将目录中的文件读取到哈希映射-递归
下面我将尝试将文件名从嵌套文件夹结构读入hashmap,Java-将目录中的文件读取到哈希映射-递归,java,recursion,Java,Recursion,下面我将尝试将文件名从嵌套文件夹结构读入hashmap, 结构就像 Main Folder -> EN (SubFolder1) -> File1 -> File2 -> FR (SubFolder2) -> File3 -> File4 -> GE (SubFolder3)
结构就像
Main Folder
-> EN (SubFolder1)
-> File1
-> File2
-> FR (SubFolder2)
-> File3
-> File4
-> GE (SubFolder3)
-> File5
-> File6
HashMap包含“Sub FolderName”作为键和“FileName”(ArrayList)作为值
我试图进行一个递归调用&将内容保存到HashMap中,但缺少一些内容,无法将内容保存到HashMap中
public static HashMap<String,ArrayList<String>> listFilesForFolder(File folder)
throws IOException {
HashMap<String, ArrayList<String>> dirFiles = new HashMap<String, ArrayList<String>>();
if(folder.isDirectory()) {
ArrayList<String> fileNames = new ArrayList<String>();
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
listFilesForFolder(fileEntry);
dirFiles.put(folder.getName(), fileNames);
} else {
String fileName = (fileEntry.getPath()).toString();
fileNames.add(fileEntry.getPath());
}
}
}
return dirFiles;
}
谢谢。如果希望函数是递归的,并保留
映射(尽管这不是最佳选择),其定义应为:
Map<String,Map> listFilesForFolder(File folder);
这里是一个使用JSR203API的解决方案(如果您使用Java 7+,那么您应该在2011年后的任何时候使用它;下面的代码假定为Java 7+(未经测试;但它应该可以工作):
公共静态映射列表文件(最终路径baseDir)
抛出IOException
{
final Map=new HashMap();
试一试(
最终目录流
=Files.newDirectoryStream(baseDir);
) {
对于(最终路径子目录:流)
人口地图(地图、分区);
}
返回ret;
}
私有静态void populateMap(最终贴图,
最终路径(R)
抛出IOException
{
//.getFileName()返回路径的最后一个组件。。。
//不管该组件是否实际上是一个“文件”
最终字符串dirname=subdir.getFileName().toString();
put(dirname,newarraylist());
试一试(
最终目录流
=Files.newDirectoryStream(subdir);
)
{
用于(最终路径条目:流)
map.get(dirname).add(entry.getFileName().toString());
}
}
公共类文件夹{
public static HashMap dirFiles=new HashMap();
公用静态无效ListFileForFolder(文件文件夹)
抛出IOException{
if(folder.isDirectory()){
ArrayList文件名=新的ArrayList();
对于(最终文件条目:folder.listFiles()){
//System.out.println(fileEntry.toString());
if(fileEntry.isDirectory()){
//System.out.println(fileEntry.toString());
listFilesForFolder(文件条目);
}否则{
字符串文件名=(fileEntry.getPath()).toString();
add(fileEntry.getPath());
}
}
dirFiles.put(folder.getName(),filename);
}
}
公共静态void main(字符串[]args)引发IOException{
//TODO自动生成的方法存根
listFilesForFolder(新文件(“C:/Users/Guest/Documents/MainFolder”);
对于(条目foldername:dirFiles.entrySet())
{
System.out.println(foldername.getKey()+“”+foldername.getValue());
}
}
}
您的代码中需要进行非常微小的更改
仅当在中循环浏览整个文件列表时
folder.listFiles(),fileNames arraylist用名称填充
文件的数量。因此我把移动地图放在操作结束后
循环
您正在为每个迭代创建贴图对象,尽管
从函数返回映射对象,每个递归调用
行。必须同时处理所有贴图对象。因此
全局映射对象
为什么不使用JSR203?会发生什么?你拿到一张空地图了吗?您是否验证了您的文件夹
实际上是一个目录?您的for
循环是否运行?请尝试添加打印语句以仔细检查这些假设。@fge可能他们不知道。。。一个链接将是一个良好的开端。更多关于手头问题的细节将不胜感激;例如,是否只有第一级目录?第二,您使用Java8、Java7还是Java6-?第三,为什么将映射作为返回类型?为什么方法是递归的?显示的结构不是:只有一个根文件夹,包含目录和文件。这里不需要递归。只需从根目录中读取文件夹,对于每个文件夹,读取该文件夹中的所有文件。嗨,盖尔,谢谢你的贡献。listFilesForFolder(文件条目);是对整个功能起作用的主命令。
Map<String,Map> listFilesForFolder(File folder);
listFilesForFolder(fileEntry);
public static Map<String, List<String>> listFiles(final Path baseDir)
throws IOException
{
final Map<String, List<String>> map = new HashMap<>();
try (
final DirectoryStream<Path> stream
= Files.newDirectoryStream(baseDir);
) {
for (final Path subdir: stream)
populateMap(map, subdir);
}
return ret;
}
private static void populateMap(final Map<String, List<String>> map,
final Path subdir)
throws IOException
{
// .getFileName() returns the last component of the path...
// REGARDLESS of whether that component is actually a "file"
final String dirname = subdir.getFileName().toString();
map.put(dirname, new ArrayList<>());
try (
final DirectoryStream<Path> stream
= Files.newDirectoryStream(subdir);
)
{
for (final Path entry: stream)
map.get(dirname).add(entry.getFileName().toString());
}
}
public class Folder {
public static HashMap<String, ArrayList<String>> dirFiles = new HashMap<String, ArrayList<String>>();
public static void listFilesForFolder(File folder)
throws IOException {
if(folder.isDirectory()) {
ArrayList<String> fileNames = new ArrayList<String>();
for (final File fileEntry : folder.listFiles()) {
// System.out.println(fileEntry.toString());
if (fileEntry.isDirectory()) {
// System.out.println(fileEntry.toString());
listFilesForFolder(fileEntry);
} else {
String fileName = (fileEntry.getPath()).toString();
fileNames.add(fileEntry.getPath());
}
}
dirFiles.put(folder.getName(), fileNames);
}
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
listFilesForFolder(new File("C:/Users/Guest/Documents/MainFolder"));
for(Entry<String, ArrayList<String>> foldername : dirFiles.entrySet())
{
System.out.println(foldername.getKey() + " " + foldername.getValue());
}
}
}