Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将URL转换为普通windows文件名Java 6_Java_Url_Path - Fatal编程技术网

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

将URL转换为普通windows文件名Java 6,java,url,path,Java,Url,Path,我试图从jar文件中读取包名。我的问题是,当我获取URL时,它包含windows文件识别的无法识别的表单 我读了这个解决方案。但这对我没有帮助 directoryURL.toURI().getSchemeSpecificPart()不转换windows样式 这是我的密码 // Get a File object for the package URL directoryURL = Thread.currentThread().getContextClassLoader()

我试图从jar文件中读取包名。我的问题是,当我获取URL时,它包含windows文件识别的无法识别的表单

我读了这个解决方案。但这对我没有帮助

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
“jar:…”URL不标识文件。相反,它标识JAR文件的一个成员

语法是(粗略地说)
“jar:!”
,其中的本身就是一个URL;e、 在你的例子中是一个“文件:”URL

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

  • 提取原始URL的schemeSpecificPart

  • 在“!”字符上拆分SchemaSpecificPart

  • 将“!”前面的部分解析为URI,然后使用
    文件(URI)
    获取
    文件

  • 使用
    文件
    打开
    ZipFile

  • ZipFile
    中查找“!”后面的零件


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

  • 使用getResource(package).getURI()或getresourcer(package).toFile可以获得资源的路径
  • 对其执行子字符串以提取file://和之间的零件!这是指向感兴趣的jar的物理位置的路径
  • 在这个子路径上删除新文件,您就有了jar的句柄
  • Jar是一个普通的zip文件,并按原样处理它(java.util.zip和web上的手册)
  • 列出zip文件的内容(现在您可能需要使用后面的位进行导航!在原始路径中签名),然后您就可以获得类名

  • 我不确定这是否是实现您的目标的最佳方式,我将检查类发现(这是您正在尝试做的)是如何在一些开源框架中实现的(例如tomcat使用它,JPA Improvementation来查找实体).apache上也有发现项目,但它似乎已经死了一段时间。

    您希望输出是什么?从jar文件中读取包名是什么意思?您想列出jar的内容吗?您想访问jar中的特定文件吗?您的示例代码将包名解析为与此包一起加载的jare jar本身是一个zip文件,其内容永远不会解析为正常的windows路径(因为您在归档文件中)这就是为什么您有一个方法getResourceAsStream,这样您就可以从jar中读取内容。West.O wxpect ro remove file:从头开始。这是我的期望:C:/SVN/AAA/trunk/AAA/client/target/server-1.0.jar/packageName@Zielu.我添加了一些代码来理解我的目标。我想阅读一些特殊包的类名。所以我稍后使用反射类.ForName()。因此getResourceAsStream不适合我。此代码以前用于EJB服务器项目。但现在我将服务器jar添加为单独的依赖项jar。它不起作用。原始URL是什么意思?包含包名的URL?(jar:file:/SVN/AAA/trunk/AAA/client/target/server-1.0.jar!/packageName或jar:file:/C:/SVN/AAA/trunk/AAA/client/target/server-1.0.jar!/)。如果是第二个,我不知道怎么做。只有getResorce..方法返回URL。我如何执行第三步?新URL(schemeSpecificPart)将完成工作?
    新文件(新URI)(schemeSpecificPart的一部分,位于“!”之前)