Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-将目录中的文件读取到哈希映射-递归_Java_Recursion - Fatal编程技术网

Java-将目录中的文件读取到哈希映射-递归

Java-将目录中的文件读取到哈希映射-递归,java,recursion,Java,Recursion,下面我将尝试将文件名从嵌套文件夹结构读入hashmap, 结构就像 Main Folder -> EN (SubFolder1) -> File1 -> File2 -> FR (SubFolder2) -> File3 -> File4 -> GE (SubFolder3)

下面我将尝试将文件名从嵌套文件夹结构读入hashmap,
结构就像

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());
            }
        }
    
    }