我想简化我的代码。
我的代码用于列出目录,检查文件夹是否包含文件:strings.xml,如果特定文件夹包含文件,请拆分这些文件夹的名称以获取语言后缀(将其加载到表或列表中),例如:
我的目录树包含一些文件夹
--value
--value-zh
--value-de
--value-pl
-其他文件夹
我的代码:
语言在下面的示例中是[]。
Path dir_path = Paths.get("D:/Work/Projekty/Java/Tools/Mobilne zasoby/arcadia-drafter/res/");
DirectoryStream<Path> stream = Files.newDirectoryStream(dir_path);
for (Path file_path : stream)
{
DirectoryStream<Path> stream1 = Files.newDirectoryStream(file_path, "strings.xml");
for (Path xml_name : stream1)
{
if (file_path.getFileName().toString().startsWith("values-"))
{
languages = file_path.getFileName().toString().split("-");
}
}
}
您能帮我简化这段代码吗? 我想知道我是否必须2次使用Directory流。
答案 0 :(得分:0)
我不确定您提供的代码是否可以解决您描述的问题。但是,假设确实如此-有一些建议:
DirectoryStream
应该关闭。如果您不使用
try-with-resources
声明,不要忘记关闭流
finally
块。因此,这是一种使代码更简洁的方法:
public List<String> getLanguages(String directoryPath) throws IOException {
List<String> languages = new ArrayList<>();
try (DirectoryStream<Path> paths = Files.newDirectoryStream(Paths.get(directoryPath))) {
for (Path filePath : paths) {
try (DirectoryStream<Path> filePaths = Files.newDirectoryStream(filePath, "strings.xml")) {
languages.addAll(getValues(filePaths));
}
}
}
return languages;
}
private List<String> getValues(DirectoryStream<Path> paths) {
return StreamSupport.stream(paths.spliterator(), false)
.map(path -> path.getFileName().toString())
.filter(fileName -> fileName.startsWith("values-"))
.flatMap(fileName -> Arrays.stream(fileName.split("-")))
.collect(Collectors.toList());
}