所以我使用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中失败。
答案 0 :(得分:2)
它已成为embedded-resource。在这种情况下,必须由URL
而不是File
访问资源。有关标记的info page,请参阅URL
。
另见How can an app use files inside the JAR for read and write?