当前位置: 首页 > 面试题库 >

如何在Java中引用资源?

秦鹏飞
2023-03-14
问题内容

我需要读取代码中的文件。它实际上位于此处:

C:\eclipseWorkspace\ProjectA\src\com\company\somePackage\MyFile.txt

我将其放在源包中,以便在创建可运行的jar文件(导出-> Runnable
JAR文件)时将其包含在jar中。最初,我将其放在项目根目录中(并尝试了一个普通的子文件夹),但导出文件并未将其包含在jar中。

如果在我的代码中,我这样做:

File myFile = new File("com\\company\\somePackage\\MyFile.txt");

jar文件正确地找到了该文件,但是在本地运行(运行方式-> Java Main应用程序)会引发文件未找到异常,因为它希望它是:

File myFile = new File("src\\com\\company\\somePackage\\MyFile.txt");

但这在我的jar文件中失败。所以我的问题是,如何使此概念适用于本地运行和在jar文件中运行?


问题答案:

使用ClassLoader.getResourceAsStreamClass.getResourceAsStream。两者之间的主要区别在于,该ClassLoader版本始终使用“绝对”路径(在jar文件或任何其他文件中),而该Class版本是相对于类本身的,除非您使用/前缀。

因此,如果您有一个类,com.company.somePackage.SomeClass并且com.company.other.AnyClass(在与资源相同的类加载器中)可以使用:

SomeClass.class.getResourceAsStream("MyFile.txt")

要么

AnyClass.class.getClassLoader()
              .getResourceAsStream("com/company/somePackage/MyFile.txt");

要么

AnyClass.class.getResourceAsStream("/com/company/somePackage/MyFile.txt");


 类似资料:
  • 我正在使用Gradle构建一个jar,其中包含META-INF中的xml文件。此文件的行如下 允许针对不同环境使用不同的SQL数据库。我想告诉gradle从项目属性展开${SQLDialent}。 我试过这个: 但是它因为而失败,在我看来,Jar任务也试图扩展文件中的属性。所以我尝试了 这不会引发上述异常,而是导致所有资源被复制两次—一次使用属性扩展,一次不使用属性扩展。我设法解决了这个问题 这正

  • 我正在寻找正确的url来引用静态资产,比如VUEJavaScript中的图像。 例如,我正在使用自定义图标图像创建传单标记,我尝试了几个URL,但它们都返回: Main.vue: 我试过把图像放在资产文件夹和静态文件夹,但没有运气。我必须告诉Vue以某种方式加载那些图像吗?

  • 当我在gradle中运行构建任务时,它将所有的Java资源(从src/main/resources)复制到build/resources中。因为我有太重的文件,所以我的构建过程比可能的要慢得多。 有什么方法可以禁止复制它们,并迫使Java仅仅从src/main/resources使用它们吗?

  • 我有一个使用Maven的JavaFX程序,它有一个标准的Maven文件树: 我如何引用layout.fxml内的logo.png,假设布局通过调用 在中。 我一直在尝试使用 并尝试了该文件路径的许多变体(有和没有),但是继续抛出 在创建URL的行上

  • 问题内容: 我有一个缓存,其中包含对缓存对象的软引用。我正在尝试针对使用高速缓存的类的行为编写功能测试,专门用于清除高速缓存的对象时发生的情况。 问题是:我似乎无法可靠地清除软引用。简单地用完一堆内存并不能解决问题:在清除任何软引用之前,我会得到一个OutOfMemory。 有什么方法可以使Java更急切地清除软引用? 在这里 找到 : “尽管可以保证所有的SoftReferences在抛出Out

  • 问题内容: 我正在尝试将json对象导入变量。我根据教程使用服务。 我收到意外的令牌错误,因为我不应该使用 -但我真的不知道该使用什么。我用谷歌搜索了3个小时,发现只有$ http。或$ json。答案,但是我觉得可以做得更容易-更清晰。 (完美的解决方案是; D 服务文件: 控制器文件: json文件(几乎; D) 编辑: 我将$ resource(’file.json更改为https://ww