【问题标题】:Java: opening a resource (txt file) which is in a jar with OS standard applicationJava:使用 OS 标准应用程序打开 jar 中的资源(txt 文件)
【发布时间】:2011-11-01 18:33:46
【问题描述】:

我收到错误“AWT-EventQueue-0 java.lang.IllegalArgumentException:URI 不是分层的”。 -我正在尝试使用 java.awt.Desktop api 使用操作系统的默认应用程序打开一个文本文件。 - 我正在运行的应用程序是从自动运行的 jar 启动的。 我知道从文件中获取“文件”不是正确的方法,它被称为资源。我还是打不开,不知道怎么做。

open(new File((this.getClass().getResource("prova.txt")).toURI()));

有没有办法从我的应用程序中使用标准 os 应用程序打开资源? 谢谢 :)

【问题讨论】:

  • 你的类路径中有prova.txt吗? getResource() 仅适用于您的类路径中的文件。
  • 是的,当我在 Eclipse 中打开它时它可以工作,而在罐子中它是不可能的:)

标签: java resources jar text-files


【解决方案1】:

您必须将文件从 Jar 提取到临时文件夹并打开该临时文件,就像您处理 Zip 文件(基本上是 Jar)中的文件一样。

【讨论】:

  • 好的,这是我试图避免的解决方案,我正在创建一个安装程序,我不想在用户单击“安装”之前提取任何内容。有没有办法“即时”做到这一点? :) 谢谢 :)
  • @Alessandro 我不这么认为,因为您不能依赖标准操作系统应用程序来读取普通文件以外的其他来源。
  • @Allessando,请站在您的操作系统或您要启动的应用程序的角度!到底应该怎么写?能够打开“C:\...\autorunning.jar:\your.package.file.doc”吗?显然 Word 和任何其他程序无法查看您的 Jar 文件内部,因此您需要将“File.doc”提取到某个 tmp 文件夹并启动 Word,例如那么。
  • 是的..我正在弄清楚..我虽然 java 可以创建一个“幽灵”或虚拟文档以使其可打开:D thx 大家!
  • @Alessandro “幽灵”文件实际上是你的临时文件 :)
【解决方案2】:

您不必将文件解压缩到 /tmp 文件夹。您可以使用 `getClass().getResourceAsStream()' 直接读取它。但请注意,路径取决于您的 txt 文件的位置以及您的课程包是什么。如果您的 txt 文件打包在 jar 的根目录中,请使用 '"/prova.txt"'。 (注意前导斜杠)。

【讨论】:

  • 这不是“使用标准应用程序打开文件”,而是在 JVM 中打开它以使用 Java 程序读取......这意味着正在运行的程序正在读取文件。
【解决方案3】:

我认为您无法使用外部应用程序打开它。据我所知,所有安装程序都将其压缩内容提取到临时位置,然后将其删除。

但是你可以在你的 Java 代码中使用 Class.getResource(String name)

http://download.oracle.com/javase/6/docs/api/java/lang/Class.html#getResource(java.lang.String)

【讨论】:

  • 我试过了,它可以在 Eclipse 中工作,但 jar 内部没有结果 :(
  • 为了让它工作,你要访问的文件必须在你的类路径中。在eclipse中,把它放在src或者src的子文件夹中,eclipse在构建的时候会复制到bin。使用默认设置,当您将某些内容导出为可运行的 jar 时,eclipse 不包含类路径之外的文件夹。您可以将 jar 文件重命名为 .zip 并检查其内容。
【解决方案4】:

错误

open(new File((this.getClass().getResource("prova.txt")).toURI()));

/**

Do you accept the License Agreement of XYZ app.?

*/
import java.awt.Dimension;
import javax.swing.*;

import java.net.URL;
import java.io.File;
import java.io.IOException;

class ShowThyself {

    public static void main(String[] args) throws Exception {
        // get an URL to a document..
        File file = new File("ShowThyself.java");
        final URL url = file.toURI().toURL();

        // ..then do this
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                JEditorPane license = new JEditorPane();
                try {
                    license.setPage(url);
                    JScrollPane licenseScroll = new JScrollPane(license);
                    licenseScroll.setPreferredSize(new Dimension(305,90));

                    int result = JOptionPane.showConfirmDialog(
                        null,
                        licenseScroll,
                        "EULA",
                        JOptionPane.OK_CANCEL_OPTION);
                    if (result==JOptionPane.OK_OPTION) {
                        System.out.println("Install!");
                    } else {
                        System.out.println("Maybe later..");
                    }
                } catch(IOException ioe) {
                    JOptionPane.showMessageDialog(
                        null,
                        "Could not read license!");
                }
            }
        });
    }
}

【讨论】:

    【解决方案5】:

    JDK 中有 JarFileJarEntry 类。这允许从 JarFile 加载文件。

    JarFile jarFile = new JarFile("jar_file_Name");
    JarEntry entry = jarFile.getJarEntry("resource_file_Name_inside_jar");
    InputStream stream = jarFile.getInputStream(entry); // this input stream can be used for specific need
    

    【讨论】:

      【解决方案6】:

      如果您要传递的内容可以接受java.net.URLthis 将起作用:

      this.getClass().getResource("prova.txt")).toURI().toURL()

      【讨论】:

        猜你喜欢
        • 2010-12-13
        • 2011-06-11
        • 2014-11-18
        • 2010-09-30
        • 2015-01-19
        • 2015-03-20
        • 2022-01-09
        • 2014-01-31
        相关资源
        最近更新 更多