当程序打包为jar时,无法读取文件并使用gson解析

时间:2013-12-25 12:26:48

标签: java json eclipse jar embedded-resource

所以我使用json将一些数据存储在txt文件中。我用Gson来解决json问题。这项计划在日食方面进展顺利。但是当我将它打包成一个罐子时,问题就会出现问题。

我先做的(在日食中)是:

        String gsonStr = gson.toJson(masterShips);
        BufferedWriter writer = null;
        try {
            writer = new BufferedWriter(new FileWriter("D:\\master_ship.txt"));
            writer.write(gsonStr);
        } catch (IOException e) {
            System.err.println(e);
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    System.err.println(e);
                }
            }
        }

然后我将.txt文件复制到eclipse并使用以下代码读取它:

Scanner in = new Scanner(new FileReader("master_ship.txt"));

String str = in.nextLine();
Log.toDebug(str);
in.close();
JsonParser parser = new JsonParser();
JsonElement je = parser.parse(str);
JsonArray ja = je.getAsJsonArray();
for (int i=0; i<ja.size(); ++i) { 
    ... 
}

但是当我将.jar文件和.txt文件放在同一个文件夹中并执行时,会出现错误。我认为定义路径的方式可能存在问题。最后我转向绝对路径:

Scanner in = new Scanner(new FileReader("D:\\master_ship.txt"));

尽管如此,它在eclipse中运行良好,但在使用jar时却不行。然后我用命令行打开了jar:

Exception in thread "main" com.google.gson.JsonSyntaxException: com.google.gson.
stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malform
ed JSON at line 1 column 4
        at com.google.gson.JsonParser.parse(JsonParser.java:65)
        at com.google.gson.JsonParser.parse(JsonParser.java:45)
        at kan.util.Master.loadMasterShip(Master.java:44)
        at kan.util.Master.load(Master.java:27)
        at kan.Main.main(Main.java:22)
Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLeni
ent(true) to accept malformed JSON at line 1 column 4
        at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1505)
        at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1386)
        at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:531)
        at com.google.gson.stream.JsonReader.peek(JsonReader.java:414)
        at com.google.gson.JsonParser.parse(JsonParser.java:60)
        ... 4 more

我可以肯定该文件已成功读取,因为jar可以完全输出它从文件中读取的字符串。但是为什么Gson在eclipse中做错时会在eclipse中失败。

1 个答案:

答案 0 :(得分:2)

它已成为。在这种情况下,必须由URL而不是File访问资源。有关标记的info page,请参阅URL

另见How can an app use files inside the JAR for read and write?