将URL转换为普通windows文件名Java 6
我试图从jar文件中读取包名。我的问题是,当我获取URL时,它包含windows文件识别的无法识别的表单 我读了这个解决方案。但这对我没有帮助将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()
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文件并迭代类似的条目,则需要:
文件(URI)
获取文件
文件
打开ZipFile
ZipFile
中查找“!”后面的零件斯蒂芬的答案包含了你需要的所有元素
我不确定这是否是实现您的目标的最佳方式,我将检查类发现(这是您正在尝试做的)是如何在一些开源框架中实现的(例如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的一部分,位于“!”之前)