从jar中的属性文件中读取特定属性

时间:2016-09-01 15:36:39

标签: java zip properties-file

我需要阅读该物业" product.build.number"来自属性文件" version.properties"它位于每个罐子的根部。我天真的做法是:

  private static int getProductBuildNumber(File artefactFile) throws FileNotFoundException, IOException
  {
    try (ZipInputStream zip = new ZipInputStream(new FileInputStream(
        artefactFile)))
    {

      Set<String> possClasses = new HashSet<>();

      for (ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip
          .getNextEntry())
      {
        if (!entry.isDirectory() && entry.getName().toLowerCase().equals(
            "version.properties"))
        {
          List<String> lines = IOUtils.readLines(zip, (String) null);

          for (String line : lines)
          {
            if (line.startsWith("product.build.number"))
            {
              String[] split = line.split("=");
              if (split.length == 2)
              {
                return Integer.parseInt(split[1]);
              }

            }
          }

        }
      }
    }

    throw new IOException("product.build.number not found.");

  }

我想有更优雅可靠的方式。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

尝试类似(未经测试)的内容:

private static int getProductBuildNumber(Path artefactFilePath) throws IOException{
   try(FileSystem zipFileSystem = FileSystems.newFileSystem(artefactFilePath, null)){
      Path versionPropertiesPath = zipFileSystem.getPath("/version.properties");
      Properties versionProperties = new Properties();
      try (InputStream is = Files.newInputStream(versionPropertiesPath)){
          versionProperties.load(is);
      }
      return Integer.parseInt(versionProperties.getProperty("product.build.number"));
   }
}

答案 1 :(得分:0)

您还没有说过.jar文件是否在您的类路径中。

如果它们在您的类路径中,您应该使用Class.getResourceAsStream来阅读条目:

try (InputStream propStream = getClass().getResourceAsStream("/version.properties")) {
    // ...
}

如果他们的.jar文件不在您的类路径中,您应该从该文件创建一个jar:URL。这种URL的格式在JarURLConnection documentation

中描述

请注意,java.io.File已过时,您应始终使用Path代替:

private static int getProductBuildNumber(Path artefactFile)
throws IOException {
    URL propsURL = new URL("jar:" + artefactFile.toUri() + "!/version.properties");
    try (InputStream propStream = propsURL.openStream()) {
        // ...
    }
}

无论数据的位置如何,您都应该始终使用Properties类来读取属性。 (自己解析属性文件意味着您必须考虑注释,Unicode转义,连续行和所有可能的名称/值分隔符。)

Properties props = new Properties();
try (InputStream propStream = getClass().getResourceAsStream("/version.properties")) {
    props.load(propStream);
}

int buildNumber = Integer.parseInt(
    props.getProperty("product.build.number"));