如何检索 .JAR 项目中的文件

问题描述 投票:0回答:1

我对 java 很陌生,并使用 JFrames 和 JPanels 制作了一个新项目来创建一个时钟显示来告诉时间、日期和天数。现在,当我将项目打包成 JAR 可执行文件并运行它时,我遇到了异常,并且不知道如何跟踪异常是什么/在哪里。我调查了一下,发现我从源代码获取资源(文件)的方式是不正确的。我获取该文件的方法是:“File {insert var name} = new File(projectname...\src\Assets\Cozy.ttf”),这只是 JPanel 使用的字体。我越是继续阅读“getResourceAsStream()”和“getResource()”等替代方案,我就越陷入困境。我不知道从哪里开始,因为我还没有处理过这个级别的文件。我读到了有关“File.createTempFile()”的内容,但这一切似乎都很令人困惑。我找不到任何简单有效的文档来满足我的需要。

我遇到的主要问题是我无法从 .JAR 内部加载 File 对象。我知道我没有进行描述,或者在没有任何代码的情况下这不是很有帮助,但我真的不知道现在该怎么做。

我尝试研究 Class.getResourceAsStream(),并在毫无问题地检索指定对象方面取得了一些成功,但是当我考虑将 InputStream 转换为文件时,整个事情变得有点无用,并没有得到任何真正容易的东西把我的头围起来。

我也不知道是否可以将原始 InputStream 使用到 Font 对象中,以使 Font.createFont(truetypeConstant,InputStream) 成为有效语法。

java file inputstream executable-jar
1个回答
0
投票

File
是字面意思。例如,它代表文件,而“jar 文件中的东西”不是文件。因此,如果不打开这些东西,你想要的东西就不可能实现。更一般地说,如果
src
位于硬编码路径中的任何位置,则这是行不通的。

解决办法是资源加载:

public class ThisIsAnExample {
  public void setIconExample() {
    JLabel label = ...;
    label.setIcon(new ImageIcon(ThisIsAnExample.class.getResource("myIcon.png")));
  }
}

使用注意事项:

  • 路径是相对于类文件的。在你的罐子里的某个地方,有
    ThisIsAnExample.class
    。在同一个地方(同一个目录),放置
    myIcon.png
  • Maven 会自动将内容从
    /src/main/resources
    移动到 jar 中。如果您使用不同的构建系统,请找出放置非 java 文件的位置,以便将它们包含在内。如果您自己编写,请将它们复制到 jar 中。
  • 您可以使用
    /myIcon.png
    相对于 jar 的根。
  • 如果您对它在哪里寻找感到困惑,请打印
    MyClass.class.getResource("MyClass.class")
    - 类文件同样是资源,您可以索要它。
  • getResource
    返回一个 Swing 中的许多东西都允许的 URL,所以,使用它。如果没有,那么,有
    getResourceAsStream
    需要
    try () {}
    才能安全使用,那么,您就有了一个可以读取的输入流。
  • 您可以打开 jar 中条目的内容。 您无法列出 jar 内容。如果需要,请使用 SPI。
  • 不要打电话给
    .getClassLoader()
    ,也不要打电话给
    .getClass()
    。这是
    MyClassName.class.getResource
    (或
    getResourceAsStream
    )。它们不会让事情变得更好,并且在某些情况下,这些替代方案会破坏
    MyClass.class.getResource
    却不会。
  • jar tvf myjar.jar
    向您展示了 jar 结构。
© www.soinside.com 2019 - 2024. All rights reserved.