如何取消 Java 中的文件?
How to unpickle a file in Java?
我有一个 'pickle' 格式的数据文件,它是由 Python 进程创建的(实际上是 MCDungeon 缓存文件)。我想从 Java 程序中读取此内容。
为此,我使用了以下代码:
public HashMap<String, Object> getDataFileStream(String filename) {
HashMap<String, Object> data = new HashMap<String, Object>();
File f = new File(filename);
InputStream fs = null;
try {
fs = new FileInputStream(f);
} catch (FileNotFoundException e) {
Log.warning("Pickle file '"+filename+"' not found!");
return null;
}
PyFile picklefile = new PyFile(fs);
PyDictionary phash = null;
try {
phash = (PyDictionary) cPickle.load(picklefile);
} catch ( PyException e3 ) {
log.severe("Cannot unpickle! (Python error)");
e3.printStackTrace(); // throws a null pointer exception
return null;
} catch ( Exception e ) {
log.severe("Cannot unpickle! Err: " + e.getClass().getName());
e.printStackTrace();
return null;
}
ConcurrentMap<PyObject, PyObject> aMap = phash.getMap();
for (Map.Entry<PyObject, PyObject> entry : aMap.entrySet()) {
String keyval = entry.getKey().toString();
PyObject tileentity = (PyList) entry.getValue();
try {
data.put(keyval, pythonToJava(tileentity));
} catch (Exception e) {
data.put(keyval, tileentity);
}
}
return data;
}
我已经包含了 JYthon 库,以及 pythonToJava 函数(在其他地方)。
我传递的文件绝对是一个有效的 Picklefile,因为它可以被 Python 进程成功读取。
但是,当 运行 这个函数时,我在 cPickle.load
函数中抛出一个 PyException,并调用 printStackTrace 给定一个 NullPointer 异常(第 71 行对应于 e3.printStackTrace()
行以上)
[12:42:18 ERROR]: [DynmapMCDungeon] Cannot unpickle! (Python error)
java.lang.NullPointerException
at org.steveshipway.dynmap.PickleLoader.getDataFileStream(PickleLoader.j
ava:71) ~[?:?]
at org.steveshipway.dynmap.Dungeon.getDungeons(Dungeon.java:28) ~[?:?]
at org.steveshipway.dynmap.DynmapMCDungeon.activate(DynmapMCDungeon.java
:179) ~[?:?]
当我手动加载 Pickle 数据并传递给函数时,cPickle.load 函数中出现 NullPointerException 错误:
[13:56:57 INFO]: [DynmapMCDungeon] Reading in MCDungeon pickle...
[13:56:57 ERROR]: [DynmapMCDungeon] Cannot unpickle the MCDungeon cache! Err: java.lang.NullPointerException
[13:56:57 WARN]: java.lang.NullPointerException
[13:56:57 WARN]: at java.util.Objects.requireNonNull(Unknown Source)
[13:56:57 WARN]: at java.util.Arrays$ArrayList.<init>(Unknown Source)
[13:56:57 WARN]: at java.util.Arrays.asList(Unknown Source)
[13:56:57 WARN]: at org.python.core.PyList.<init>(PyList.java:52)
[13:56:57 WARN]: at org.python.core.PyList.<init>(PyList.java:64)
[13:56:57 WARN]: at org.python.modules.cPickle$Unpickler.load_empty_list(cPickle.java:1909)
[13:56:57 WARN]: at org.python.modules.cPickle$Unpickler.load(cPickle.java:1620)
[13:56:57 WARN]: at org.python.modules.cPickle.load(cPickle.java:636)
[13:56:57 WARN]: at org.steveshipway.dynmap.PickleLoader.getDataFileStream(PickleLoader.java:64)
我的问题是:
为什么我尝试打印堆栈跟踪时出现错误?
我在加载 picklefile 时做错了什么?有没有更好的方法来实现这个?
提前感谢您的任何指示(最好不是空的,我已经有足够的了!)
问题似乎是我使用的是 Jython 2.5.3。升级到 Jython 2.7.0 解决了 unpickling 问题(尽管我随后遇到了将 Python 数据类型强制转换为 Java 类型的问题,但那是 seaprate)
为了解开 .pkl 文件,我使用了 Jython。 Jython 在 Java 中提供了 python2 支持,pickle 文件应使用协议代码 0,1 或 2 进行序列化。
{
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("Your Python code here");
PyObject getAtrsFunc = interpreter.get("your_python_function_name");
PyObject funcRes = getImageAtrsFunc.__call__(new PyString("Example_input_String_to_py_function"), new PyInteger(javaIntegerValue));
//Lets say function returns integer array as an output
//To convert output to java usable object
int [] resAtrs = (int []) funcRes.__tojava__(int [].class);
}
maven项目中使用jython添加
<dependency>
<groupId>org.python</groupId>
<artifactId>jython-standalone</artifactId>
<version>2.7.0</version>
</dependency>
到你的 pom 文件
我有一个 'pickle' 格式的数据文件,它是由 Python 进程创建的(实际上是 MCDungeon 缓存文件)。我想从 Java 程序中读取此内容。
为此,我使用了以下代码:
public HashMap<String, Object> getDataFileStream(String filename) {
HashMap<String, Object> data = new HashMap<String, Object>();
File f = new File(filename);
InputStream fs = null;
try {
fs = new FileInputStream(f);
} catch (FileNotFoundException e) {
Log.warning("Pickle file '"+filename+"' not found!");
return null;
}
PyFile picklefile = new PyFile(fs);
PyDictionary phash = null;
try {
phash = (PyDictionary) cPickle.load(picklefile);
} catch ( PyException e3 ) {
log.severe("Cannot unpickle! (Python error)");
e3.printStackTrace(); // throws a null pointer exception
return null;
} catch ( Exception e ) {
log.severe("Cannot unpickle! Err: " + e.getClass().getName());
e.printStackTrace();
return null;
}
ConcurrentMap<PyObject, PyObject> aMap = phash.getMap();
for (Map.Entry<PyObject, PyObject> entry : aMap.entrySet()) {
String keyval = entry.getKey().toString();
PyObject tileentity = (PyList) entry.getValue();
try {
data.put(keyval, pythonToJava(tileentity));
} catch (Exception e) {
data.put(keyval, tileentity);
}
}
return data;
}
我已经包含了 JYthon 库,以及 pythonToJava 函数(在其他地方)。
我传递的文件绝对是一个有效的 Picklefile,因为它可以被 Python 进程成功读取。
但是,当 运行 这个函数时,我在 cPickle.load
函数中抛出一个 PyException,并调用 printStackTrace 给定一个 NullPointer 异常(第 71 行对应于 e3.printStackTrace()
行以上)
[12:42:18 ERROR]: [DynmapMCDungeon] Cannot unpickle! (Python error)
java.lang.NullPointerException
at org.steveshipway.dynmap.PickleLoader.getDataFileStream(PickleLoader.j
ava:71) ~[?:?]
at org.steveshipway.dynmap.Dungeon.getDungeons(Dungeon.java:28) ~[?:?]
at org.steveshipway.dynmap.DynmapMCDungeon.activate(DynmapMCDungeon.java
:179) ~[?:?]
当我手动加载 Pickle 数据并传递给函数时,cPickle.load 函数中出现 NullPointerException 错误:
[13:56:57 INFO]: [DynmapMCDungeon] Reading in MCDungeon pickle...
[13:56:57 ERROR]: [DynmapMCDungeon] Cannot unpickle the MCDungeon cache! Err: java.lang.NullPointerException
[13:56:57 WARN]: java.lang.NullPointerException
[13:56:57 WARN]: at java.util.Objects.requireNonNull(Unknown Source)
[13:56:57 WARN]: at java.util.Arrays$ArrayList.<init>(Unknown Source)
[13:56:57 WARN]: at java.util.Arrays.asList(Unknown Source)
[13:56:57 WARN]: at org.python.core.PyList.<init>(PyList.java:52)
[13:56:57 WARN]: at org.python.core.PyList.<init>(PyList.java:64)
[13:56:57 WARN]: at org.python.modules.cPickle$Unpickler.load_empty_list(cPickle.java:1909)
[13:56:57 WARN]: at org.python.modules.cPickle$Unpickler.load(cPickle.java:1620)
[13:56:57 WARN]: at org.python.modules.cPickle.load(cPickle.java:636)
[13:56:57 WARN]: at org.steveshipway.dynmap.PickleLoader.getDataFileStream(PickleLoader.java:64)
我的问题是:
为什么我尝试打印堆栈跟踪时出现错误?
我在加载 picklefile 时做错了什么?有没有更好的方法来实现这个?
提前感谢您的任何指示(最好不是空的,我已经有足够的了!)
问题似乎是我使用的是 Jython 2.5.3。升级到 Jython 2.7.0 解决了 unpickling 问题(尽管我随后遇到了将 Python 数据类型强制转换为 Java 类型的问题,但那是 seaprate)
为了解开 .pkl 文件,我使用了 Jython。 Jython 在 Java 中提供了 python2 支持,pickle 文件应使用协议代码 0,1 或 2 进行序列化。
{
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("Your Python code here");
PyObject getAtrsFunc = interpreter.get("your_python_function_name");
PyObject funcRes = getImageAtrsFunc.__call__(new PyString("Example_input_String_to_py_function"), new PyInteger(javaIntegerValue));
//Lets say function returns integer array as an output
//To convert output to java usable object
int [] resAtrs = (int []) funcRes.__tojava__(int [].class);
}
maven项目中使用jython添加
<dependency>
<groupId>org.python</groupId>
<artifactId>jython-standalone</artifactId>
<version>2.7.0</version>
</dependency>
到你的 pom 文件