Я хотел бы прочитать файлы из подкаталогов папки ресурсов.У меня проблемы с выполнением jar.
Это моя структура каталогов.
src/main/resources
|_ Conf
|_ conf1
|_ config.txt
|_ conf2
|_ config.txt
Здесь я пытаюсь прочитать config.txt
файлы из всех подкаталоговиз папки Conf
.Я не знаю, какие будут подкаталоги Conf
.Я знаю путь к классу до Conf
.Итак, я дам classpath до 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, чтобы найти подкаталоги и файлы.