我需要阅读该物业" 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.");
}
我想有更优雅可靠的方式。有什么想法吗?
答案 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"));