将URL转换为普通的Windows文件名Java 6

时间:2015-02-16 12:06:36

标签: java url path

我正在尝试从jar文件中读取包名。我的探索是,当我获得URL时,它包含无法识别的表单,以便被Windows文件识别。

我读了这个解决方案。但这对我没有帮助。 Convert URL to normal windows filename Java

directoryURL.toURI().getSchemeSpecificPart()不会转换Windows样式。

这是我的代码。

// Get a File object for the package
URL directoryURL = Thread.currentThread().getContextClassLoader()
            .getResource(packageNameSlashed);

logger.info("URI" + directoryURL.toURI());
logger.info("Windows file Name" + directoryURL.toURI().getSchemeSpecificPart());

// build jar file name, then loop through zipped entries
jarFileName = URLDecoder.decode(directoryURL.getFile(), "UTF-8");
jarFileName = jarFileName.substring(0, jarFileName.indexOf(".jar"));

// HERE Throws exception"
jf = new JarFile(jarFileName + ".jar");

while (jarEntries.hasMoreElements()) {
                entryName = jarEntries.nextElement().getName();
                logger.info("Entry name: " + entryName);
                if (entryName.startsWith(packageNameSlashed)
                        && entryName.length() > packageNameSlashed.length() + 5
                        && entryName.endsWith(".class")) {
                    entryName = entryName.substring(packageNameSlashed.length() + 1);
                    packageClassNames.put(entryName, packageName);
                }
            }

这是日志。

16-02-2015 14:02:15 INFO  - URI jar:file:/C:/SVN/AAA/trunk/aaa/client/target/server-1.0.jar!/packageName
16-02-2015 14:02:15 INFO  Windows file Name file:/C:/SVN/AAA/trunk/aaa/client/target/server-1.0.jar!/packageName

2 个答案:

答案 0 :(得分:1)

“jar:...”URL无法识别文件。相反,它标识了JAR文件的成员。

语法是(粗略地说)"jar:<jar-url>!<path-within-jar>",其中它本身就是一个URL;例如示例中的“file:”URL。

如果要打开JAR文件并迭代这样的条目,则需要:

  1. 提取原始网址的schemeSpecificPart

  2. 将schemeSpecificPart拆分为“!”字符。

  3. 在“!”之前解析部分作为URI,然后使用File(URI)获取File

  4. 使用File打开ZipFile

  5. 在“!”之后查找部分在ZipFile ...

答案 1 :(得分:1)

斯蒂芬的答案包含了你需要的所有元素。

  1. 使用getResource(包).getURI()或getResoucer(包).toFile,您将获得资源的路径。
  2. 在其上执行子串以提取文件://和!之间的部分这是您感兴趣的罐子的物理位置的路径。
  3. 这个子路径上的新文件,你可以处理你的jar。
  4. Jar是普通的zip文件,并按原样处理(java.util.zip,网上有手册)。
  5. 列出您的zip文件的内容(现在您可能需要使用后面的位进行导航!在原始路径中签名),然后获取您的类名称。
  6. 我不确定这是否是实现目标的最佳方式,我会检查类发现(这是你想要做的,是如何在一些开源框架中实现的(例如tomcat使用它,JPA inslementation)找到权利)。还有关于apache的发现项目,但它似乎已经死了一段时间。