我想读取资源文件夹的子目录中的文件。
我在jar执行时遇到了问题。
这是我的目录结构。
src/main/resources |_ Conf |_ conf1 |_ config.txt |_ conf2 |_ config.txt
在这里,我正在尝试从“Conf”文件夹的所有子目录中读取“config.txt”文件。我不知道“Conf”将有什么子目录。我知道类路径到“Conf”。因此,我将给出到“Conf”的类路径,并尝试获取子目录和文件。
我尝试使用“ClassPathResource”实现此目标。如果是文件,则可以正常工作。当涉及到目录时,我会遇到问题。我正在使用“getFile”api获取目录路径以遍历该目录的子目录,这会导致在jar执行中出现问题。
以下是我的代码:
以下代码用于读取“Conf”文件夹中的子目录。
这是我的目录结构。
src/main/resources |_ Conf |_ conf1 |_ config.txt |_ conf2 |_ config.txt
在这里,我正在尝试从“Conf”文件夹的所有子目录中读取“config.txt”文件。我不知道“Conf”将有什么子目录。我知道类路径到“Conf”。因此,我将给出到“Conf”的类路径,并尝试获取子目录和文件。
我尝试使用“ClassPathResource”实现此目标。如果是文件,则可以正常工作。当涉及到目录时,我会遇到问题。我正在使用“getFile”api获取目录路径以遍历该目录的子目录,这会导致在jar执行中出现问题。
以下是我的代码:
以下代码用于读取“Conf”文件夹中的子目录。
List<Map<String,String>> list = new ArrayList<Map<String,String>>();
ClassPathResource classPathResource = new ClassPathResource("Conf");
File dir = classPathResource.getFile();
Files.walk(Paths.get(dir.toString()))
.filter(Files::isDirectory)
// This is to exempt current dir.
.filter((Path p)->!p.toString().equals(dir.toString()))
.forEach(f-> {list.add(readDirectory(f.toString()));});
读取每个子目录。
public Map<String, String> readDirectory(String dir) {
Map<String, String> map = new HashMap<String, String>();
String confDir = dir.substring(dir.lastIndexOf(File.separator)+1);
try {
Files.list(Paths.get(dir))
.filter(f->f.toString().matches(".*conf\\.txt"))
.forEach(file ->approvedTermsMap.put
(confDir,readFile(file.toFile())));
} catch (IOException e) {
e.printStackTrace();
}
return map;
}
读取文件:
public String readFile(File confFile) {
StringBuffer terms = new StringBuffer();
try (BufferedReader reader = new BufferedReader(new
FileReader(confFile)))
{
reader.lines().forEach(term->
terms.append(term + "|"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return terms.toString();
}
在这里,我不应该使用classPathResource.getFile()
来获取绝对路径,因为它试图在文件系统中查找文件,在jar的情况下将不可用。因此,我需要另一种方法来获取资源目录的绝对路径。我必须将其传递给File.walk
API来查找子目录和文件。