当前位置: 首页 > 知识库问答 >
问题:

为什么我的URI没有等级?[重复]

穆景辉
2023-03-14

我在资源文件夹中有文件。例如,如果我需要从资源文件夹获取文件,我会这样做:

File myFile= new File(MyClass.class.getResource(/myFile.jpg).toURI());             
System.out.println(MyClass.class.getResource(/myFile.jpg).getPath());

我已经测试过了,一切正常!

路径是

/D:/java/projects/.../classes/X/Y/Z/myFile.jpg

但是,如果我使用Maven创建jar文件:

mvn package

...,然后启动我的应用:

java -jar MyJar.jar

我有以下错误:

Exception in thread "Thread-4" java.lang.RuntimeException: ხელმოწერის განხორციელება შეუძლებელია
Caused by: java.lang.IllegalArgumentException: URI is not hierarchical
        at java.io.File.<init>(File.java:363)

…文件路径为:

file:/D:/java/projects/.../target/MyJar.jar!/X/Y/Z/myFile.jpg

当我尝试从资源文件夹获取文件时,会发生此异常。在这条线上。为什么?为什么JAR文件中有这个问题?你怎么认为?

有没有另一种方法,来获取资源文件夹路径?

共有3个答案

穆智刚
2023-03-14

我在公司做项目时也面临同样的问题。首先,URI不是层次结构问题,因为您可能正在使用“/”作为文件分隔符。

你必须记住,“/”是指视窗系统,从一个操作系统到另一个操作系统,它会变化,Linux可能会不同。因此使用File.seperator。

所以使用

this.getClass().getClassLoader().getResource("res"+File.separator+"secondFolder")

可能会删除URI不是hierarichal。但是现在你可能面临一个空指针异常。我尝试了许多不同的方法,然后使用JarEntries类来解决它。

File jarFile = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
        String actualFile = jarFile.getParentFile().getAbsolutePath()+File.separator+"Name_Of_Jar_File.jar";
        System.out.println("jarFile is : "+jarFile.getAbsolutePath());
        System.out.println("actulaFilePath is : "+actualFile);
        final JarFile jar = new JarFile(actualFile);
        final Enumeration<JarEntry> entries = jar.entries(); //gives ALL entries in jar
        System.out.println("Reading entries in jar file ");
        while(entries.hasMoreElements()) {
            JarEntry jarEntry = entries.nextElement();
            final String name = jarEntry.getName();
            if (name.startsWith("Might Specify a folder name you are searching for")) { //filter according to the path
                System.out.println("file name is "+name);
                System.out.println("is directory : "+jarEntry.isDirectory());
                File scriptsFile  = new File(name);
                System.out.println("file names are : "+scriptsFile.getAbsolutePath());

            }
        }
        jar.close();

您必须在此处显式指定jar名称。因此,使用此代码,这将为您提供jar文件夹内的目录和子目录。

阎唯
2023-03-14

以下是针对 Eclipse RCP / 插件开发人员的解决方案:

Bundle bundle = Platform.getBundle("resource_from_some_plugin");
URL fileURL = bundle.getEntry("files/test.txt");
File file = null;
try {
   URL resolvedFileURL = FileLocator.toFileURL(fileURL);

   // We need to use the 3-arg constructor of URI in order to properly escape file system chars
   URI resolvedURI = new URI(resolvedFileURL.getProtocol(), resolvedFileURL.getPath(), null);
   File file = new File(resolvedURI);
} catch (URISyntaxException e1) {
    e1.printStackTrace();
} catch (IOException e1) {
    e1.printStackTrace();
}

使用文件定位器.toFileURL(文件URL)而不是解析(文件URL)非常重要,因为当插件被打包到一个jar中时,这将导致Eclipse在临时位置创建一个解压缩的版本,以便可以使用文件访问该对象。例如,我猜拉尔斯·沃格尔在他的文章中有一个错误 - http://blog.vogella.com/2010/07/06/reading-resources-from-plugin/

欧阳嘉年
2023-03-14

你应该使用

getResourceAsStream(...);

当资源绑定为jar/war或任何其他单文件包时。

事情是这样的,jar是一个包含许多文件的单个文件(有点像zip文件)。从Os的pov中,它是一个单个文件,如果您想访问文件(您的图像文件)的部分,您必须将其用作流。

文档

 类似资料:
  • 我的目录上有一个文件。我只需要在我的超文本标记语言页面上的按钮为用户下载此文件。 我想出了这个代码,但问题是,当我单击在我的超文本标记语言页面没有发生任何事情,也没有错误。但是文件没有被下载。 我的密码在烧瓶里 注意:我检查了所有关于堆栈溢出的问题。他们中的大多数人在下载之前把文件放在静态文件夹中,或者其他我不理解他们在做什么的人,因为他们没有在HTML部分显示要做什么

  • 我已经使用开发人员沙盒帐户构建了一个集成。我最近将我的应用程序升级为live,并将我的生产环境配置为使用新的集成id和secret以及live Docusign url。 但是,当我尝试在应用程序的帐户中创建oauth连接时,我的服务器会获取一个代码,将客户端重定向到Docusign以进行身份验证,但Docusign登录屏幕显示错误“没有向Docusign注册的重定向URI”。事实并非如此-我的开

  • 我有一个通过Interface Builder定义的布局约束视图。由于它们无法暂时停用,我决定通过拨打以下电话有选择地删除它们: 但是,之后约束仍然驻留在视图中。约束。此外,我还希望以编程方式添加约束(同样,因为我无法(取消)激活它们): 对我的方法的任何调用都会导致变量wasAdded的值NO。这也反映在用户界面上,它根本没有改变。 最后,我既不能以编程方式添加约束,也不能删除添加到情节提要的约

  • 我正在使用PARSE API发出GET请求。我收到一个“414请求URI太大”错误,但我不明白为什么。这是我请求的代码:

  • 问题内容: 我知道静态方法在类级别。因此,我知道我不需要创建实例来调用静态方法。但我也知道我可以将静态方法(如LIKE)称为实例方法。这是我感到困惑的地方,因为我期望从null对象调用静态方法(就像在调用实例方法中一样)。我真的很感谢一些解释,为什么我错了一个期望。 这是示例代码: 问题答案: 通过实例调用静态方法不需要实例存在。只要编译器能够确定变量的类型,它就可以在评估表达式并丢弃结果后静态进

  • 我正在使用Spotipy从授权用户那里获取一些spotify数据,但我不知道如何授权我的帐户。 我认为服务器需要在http://www.myapp.com/callback托管一些东西,这是正确的吗?需要返回什么?也许我完全遗漏了一些东西...我对整个必需的重定向URI感到非常困惑... 我正在尝试制作一个没有网站的程序,那么我应该如何处理授权?重定向URI到底应该做什么? 谢谢 编辑: 现在使用