【问题标题】:Where does Java put resource files when I JAR my program?当我 JAR 程序时,Java 将资源文件放在哪里?
【发布时间】:2011-11-09 05:06:50
【问题描述】:

过去 2 小时一直在寻找这个,但找不到任何东西(我找到了解决相同问题的方法,但使用的是图像,而不是文本文件)。

差不多,我制作了一个读取文本文件的程序。该文件是名称和 ID 的列表。使用 Eclipse,我将文件放在我的 src 文件夹中,并在程序中将路径文件放入它。像这样:

in = new BufferedReader(new FileReader(curDir+"\\bin\\items.txt"));

其中 curDir 是用户的当前目录(通过 System.getProperty("user.dir") 找到)。

现在,问题是,当我从 Eclipse 运行程序时,程序运行良好,但是当我尝试将其设置为可运行的 JAR 然后运行它时,程序运行,但来自文本文件的信息没有加载。看起来 Eclipse 没有将文本文件放在 JAR 中。

编辑:解决了这个问题?那么 JAR 文件需要放在一个包含所有原始文件的文件夹中吗?我很困惑,那么JAR文件是什么?

【问题讨论】:

  • 一个 jar 文件基本上包含一个包含所有子目录和文件的目录。它也经常被压缩以占用更少的空间。您可以使用命令行jar -tf myfile.jar 查看 jar 文件的内容。或者在 NetBeans 中,如果我进入项目的“文件”,我可以单击构建 jar 文件并查看其内容。在 Eclipse 中必须有等价的东西。
  • 其实我忘记了最重要的部分:你可以将任何目录和文件放在一个 jar 中,但是通常用于运行代码的 jar (java -jar myJar.jar) 包含你的可执行类和资源文件。 jar 还可以包含其他 jar 文件,这在您的程序需要一些打包在 jar 中的库时很有用。

标签: java eclipse file text jar


【解决方案1】:

无论您是从 Eclipse 还是 JAR 运行,获取文件的一种更可靠的方法是这样做

MyClass.getResource("items.txt")

其中MyClass 是与您需要的资源在同一个包(文件夹)中的一个类。

如果 Eclipse 没有将文件放入您的 JAR 中,您可以转到

运行 -> 运行配置 -> -> 类路径选项卡 -> 高级 -> 添加文件夹

然后将包含您的文件的文件夹添加到类路径中。或者,导出 Ant 脚本并创建自定义构建脚本。

【讨论】:

    【解决方案2】:

    说到点子上,FileReader 只能读取磁盘文件系统资源。但是 JAR 只包含类路径资源。您需要将其作为类路径资源阅读。为此,您需要 ClassLoader

    假设Foo 是你在JAR 中需要读取资源的类,items.txt 放在JAR 的类路径根目录中,那么你应该按如下方式读取它(注意:需要前导斜杠!):

    InputStream input = Foo.class.getResourceAsStream("/items.txt");
    reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
    // ...
    

    或者,如果您想独立于类或运行时上下文,则使用相对于类路径根运行的上下文类加载器(注意:不需要前导斜杠!):

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    InputStream input = classLoader.getResourceAsStream("items.txt");
    reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
    // ...
    

    (UTF-8 当然是文件编码的字符集,否则你可能会看到Mojibake

    【讨论】:

      【解决方案3】:

      获取 jar 文件的位置

      首先创建一个文件夹(比如我的文件夹)并将文件放入其中

      考虑以下函数

      public String path(String filename)
      {
      URL url1 = getClass().getResource("");
      String ur=url1.toString();
      ur=ur.substring(9);
      String truepath[]=ur.split("myjar.jar!");
      truepath[0]=truepath[0]+"myfolder/";
      truepath[0]=truepath[0].replaceAll("%20"," ");
      return truepath[0]+filename;
      }//This method will work on Windows and Linux as well.
      //You can alternatively use the following line to get the path of your jar file
      //classname.class.getProtectionDomain().getCodeSource().getLocation().getPath();
      

      假设你的 jar 文件在 D:\Test\dist

      然后 path() 将返回 /D:/Test/dist/myfolder/filename

      现在您可以将“myfolder”放在您的 jar 文件所在的文件夹中

      如果你想访问 jar 中的一些只读文件,你应该将它复制到一个

      你的包,并且可以访问它

      yourClassname.getResource("/packagename/filename.txt");

      【讨论】:

        猜你喜欢
        • 2014-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-16
        • 2011-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多