Tec*_*hie 6 java maven spring-boot
我想从资源文件夹的子目录中读取文件。我面临着 jar 执行的问题。
这是我的目录结构。
src/main/resources
|_ Conf
|_ conf1
|_ config.txt
|_ conf2
|_ config.txt
在这里,我试图config.txt从Conf文件夹的所有子目录中读取文件。我不知道子目录Conf会有什么。我知道直到Conf. 因此,我将提供类路径直到Conf并尝试获取子目录和文件。
我尝试使用ClassPathResource. 如果它是文件,这工作正常。我在目录方面遇到问题。我正在使用getFileapi 来获取目录路径以遍历该目录以获取导致 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()));});
Run Code Online (Sandbox Code Playgroud)
读取每个子目录。
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;
}
Run Code Online (Sandbox Code Playgroud)
读取文件:
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();
}
Run Code Online (Sandbox Code Playgroud)
在这里,我不应该使用classPathResource.getFile()获取绝对路径,因为它会尝试在文件系统中查找文件,而在 jar 的情况下该文件将不可用。所以,我需要替代方法来获取资源目录的绝对路径。我必须将它传递给File.walkapi 才能找到子目录和文件。
正如问题中提到的,首先我想获取confX目录然后读取conf.txt文件。
最后,我可以解决我的问题如下。
ClassLoader cl = this.getClass().getClassLoader();
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
try {
Resource resources[] = resolver.getResources("classpath:Conf/*/");
} catch (IOException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
这将给出目录的所有子目录Conf。这里/的最后 inclasspath:Conf/*/是非常重要的。如果我们不给/它会正常工作,但不会在 jar 中工作。从上面的代码块resources[]数组将包含这样的目录位置class path resource [Conf/conf1/] and so on。我需要子目录名来读取相应的文件。这是它的代码。
Arrays.asList(resources).stream()
.forEach(resource ->{
Pattern dirPattern = Pattern.compile(".*?\\[(.*/(.*?))/\\]$");
if (resource.toString().matches(".*?\\[.*?\\]$")) {
Matcher matcher = dirPattern.matcher(resource.toString());
if (matcher.find()) {
String dir = matcher.group(1);
readFile(dir);
}
}
});
public void readFile(String dir)
{
ClassPathResource classPathResource = new ClassPathResource(dir+ "/conf.txt");
try (BufferedReader fileReader = new BufferedReader(
new InputStreamReader(classPathResource2.getInputStream()))) {
fileReader.lines().forEach(data -> System.out.println(data));
}catch (IOException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
我需要将每个 txt 文件与其对应的目录进行映射。这就是我以这种方式接近的原因。如果你只需要获取文件和阅读,你可以像下面那样做。这将列出Conf目录下的所有内容。
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
try {
Resource resources[] = resolver.getResources("classpath:Conf/**");
} catch (IOException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6921 次 |
| 最近记录: |