繁体   English   中英

从7更新到10后,Jar文件将不会显示资源

[英]Jar file won't display resource after update from 7 to 10

我经常使用某个jar文件,该文件显示一个文本文件,并允许您以不同方式过滤列表。

直到我从Java 7更新到Java 10为止,这一直很好。现在,它将不再显示资源文本文件。

这是我获得jar文件的位置: https : //github.com/dragan224/battle_cats_en_combos

jar文件的根目录中有两个.txt文件,jar会在其内部使用它们。 是否有一些安全设置阻止了此操作? 还是版本更改使代码失效了?

在代码文件中,我可以看到它正在使用: InputStream input = (InputStream) ClassLoader.class.getResourceAsStream("/" + cat_file_name);

因此,我已经对其进行了重新编译,并在命令行的编译字符串中指定了-source 1.8 ,但这没有任何区别。

我什至不知道如何弄清楚为什么它不起作用。 当我运行命令行javaw -jar CatCombos.jar (我的新编译的名称)时,它在命令行上什么也没有说。 它可以运行,但不显示文本文件,就像原始文件一样。

这一切都是在我今天安装jdk-10.0.2_windows-x64_bin.exe时开始的。 在此之前,我运行的是1.8 JRE,它运行良好。

[更新]

我安装了JDK 8.44,并从该文件夹中使用javaw.exe运行了jar文件,jar应用程序完美运行并显示了内容。 因此,某些更改或我缺少使Java 10正确运行文件的内容。

[更新]

好了,所以我对使用 Java的问题已被迁移到堆栈交流,即使它是不是一个关于编码的问题。 这是一个人的错误,并且由于现在人们认为这是一个编码问题(首先没有提供任何代码),我将假定Java 10不显示文本文件的原因是因为用于Java 8的代码不再可行。 因此,我将介绍代码,并可能通过将其转变为编码问题来解决该问题。

这是我加载文本文件的代码。

        InputStream input = (InputStream) ClassLoader.class.getResourceAsStream("/" + file_name);
        BufferedReader br = new BufferedReader(new InputStreamReader(input));
        String line = br.readLine();
        while (line != null) {
        //do something
        }

因此,对于项目的结构而言,它非常简单,并且是这样的(顺便说一句,这是我曾经使用过的第一个Java项目):

/src
/src/javafiles (no subfolders; just .java files)
/src/textfile.txt  (the one I'm trying to load)
/manifest.txt (telling which java file to start up with)
/compile.bat

因此,该文本文件位于Java二进制文件的父文件夹中。

[更新]

在将项目加载到Eclipse(我以前从未使用过)之后,我看到在这一行收到null pointer error

InputStream input = (InputStream)ClassLoader.class.getResourceAsStream(combo_file_name);

Eclipse给出了以下描述:

打开宣言InputStream java.lang.Class.getResourceAsStream(字符串名称)

@CallerSensitive

查找具有给定名称的资源。

如果此类在命名的模块中,则此方法将尝试在模块中查找资源。 这是通过委派给模块的类加载器findResource(String,String)方法来完成的,并使用模块名称和资源的绝对名称来调用该方法。 命名模块中的资源受Module getResourceAsStream方法中指定的封装规则的约束,因此,当资源是未对调用者模块开放的包中的非“ .class”资源时,此方法将返回null。

否则,如果该类不在命名模块中,则搜索与给定类关联的资源的规则由该类的定义类加载器实现。 该方法委托给该对象的类加载器。 如果此对象是由引导类加载器加载的,则该方法将委托给ClassLoader.getSystemResourceAsStream。

在委派之前,使用以下算法从给定资源名称构造绝对资源名称:•如果名称以'/'('\\ u002f')开头,则资源的绝对名称是名称后面的部分。 '/'。 •否则,绝对名称的格式如下:modified_pa​​ckage_name / name

其中Modifyed_pa​​ckage_name是此对象的软件包名称,用“ /”代替“。”。 ( '\\ u002e')。

参数:名称所需资源的名称返回:一个ja​​va.io.InputStream对象; 抛出:NullPointerException-如果名称为nullSince:1.1See如果没有找到具有此名称的资源,则该资源位于至少对调用者模块不开放的程序包中,或者安全管理器拒绝对该资源的访问。另外:Module.getResourceAsStream(字符串)@ revised9 @ specJPMS

那么,我该怎么办? 我以为.jar出于某种原因找不到文本文件。

这是我处理文件的方法:

package catcombo;

public class Main {

    public static void main(String[] args) {
        new MainWindow("NyancomboData.txt", "Names.txt");
    }

}

在从1.8到版本10的更新中,必须在类中使用静态方法引入了新的严格性。

我的代码有

InputStream input = (InputStream) ClassLoader.class.getResourceAsStream("/" + file_name);

当我将其更改为

InputStream input = MyOwnClass.class.getResourceAsStream(file_name);

然后,一切开始正常运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM