我可以简化此解决方案吗?

时间:2019-02-22 06:46:22

标签: java file path simplify

我想简化我的代码。

我的代码用于列出目录,检查文件夹是否包含文件: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流。

1 个答案:

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