Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中读取python pickle数据流_Android_Python_Pickle - Fatal编程技术网

在Android中读取python pickle数据流

在Android中读取python pickle数据流,android,python,pickle,Android,Python,Pickle,我有一个包含python pickle数据流的文件。我必须用Android阅读这个文件的内容 例如,如果我想用python读取这个数据流,我只需要使用以下代码 queue = pickle.load(open('filename', 'rb')) 我想在Android中实现同样的功能,这样我就可以读取这个pickle流数据并将其存储在某种集合中 如何实现这一点?更新:这仅适用于pickle协议2和3 我想你可能对麻省理工学院的课程特别感兴趣。从技术上讲,它是Java,但Android基本上是J

我有一个包含python pickle数据流的文件。我必须用Android阅读这个文件的内容

例如,如果我想用python读取这个数据流,我只需要使用以下代码

queue = pickle.load(open('filename', 'rb'))
我想在Android中实现同样的功能,这样我就可以读取这个pickle流数据并将其存储在某种集合中


如何实现这一点?

更新:这仅适用于pickle协议
2
3

我想你可能对麻省理工学院的课程特别感兴趣。从技术上讲,它是Java,但Android基本上是Java。要取消勾选,请执行类似以下操作:

InputStream stream = new FileInputStream("filename");
Unpickler unpickler = new Unpickler();
Object data = unpickler.load(stream);
// And cast *data* to the appropriate type.
关于进口:

import java.io.FileInputStream;
import java.io.InputStream;
import net.razorvine.pickle.Unpickler;
这些是默认情况下支持的对象:

PYTHON    ---->     JAVA
------              ----
None                null
bool                boolean
int                 int
long                long or BigInteger  (depending on size)
string              String
unicode             String
complex             net.razorvine.pickle.objects.ComplexNumber
datetime.date       java.util.Calendar
datetime.datetime   java.util.Calendar
datetime.time       java.util.Calendar
datetime.timedelta  net.razorvine.pickle.objects.TimeDelta
float               double   (float isn't used) 
array.array         array of appropriate primitive type (char, int, short, long, float, double)
list                java.util.List<Object>
tuple               Object[]
set                 java.util.Set
dict                java.util.Map
bytes               byte[]
bytearray           byte[]
decimal             BigDecimal    
custom class        Map<String, Object>  (dict with class attributes including its name in "__class__")
以及取消勾选的java代码:

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException;
import java.util.Map;
import net.razorvine.pickle.Unpickler;

public class Test {
    public static void main(String[] args) throws IOException {
        String filename = args[0];
        InputStream inputStream = new FileInputStream(filename);
        Unpickler unpickler = new Unpickler();
        Map<String, Object> data = (Map<String, Object>)unpickler.load(inputStream);
    }
}

使用
data.2
data.3
运行时,会成功。

谢谢您的回复。这看起来很有希望。我的pickle数据流包含自定义类。所以,我像这样使用它
objectdata=(Map)unpickler.load(inputStream)这给了我一个错误
net.razorvine.pickle.PickleException:构建ClassDict需要零个参数
。我做错什么了吗?@RajeshGolani看起来你需要在python端使用协议
2
3
进行pickle处理,这样它才能工作。有关更多详细信息,请参阅我的更新。
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException;
import java.util.Map;
import net.razorvine.pickle.Unpickler;

public class Test {
    public static void main(String[] args) throws IOException {
        String filename = args[0];
        InputStream inputStream = new FileInputStream(filename);
        Unpickler unpickler = new Unpickler();
        Map<String, Object> data = (Map<String, Object>)unpickler.load(inputStream);
    }
}
Exception in thread "main" net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for copy_reg._reconstructor)
  at net.razorvine.pickle.objects.ClassDictConstructor.construct(ClassDictConstructor.java:23)
  at net.razorvine.pickle.Unpickler.load_reduce(Unpickler.java:617)
  at net.razorvine.pickle.Unpickler.dispatch(Unpickler.java:170)
  at net.razorvine.pickle.Unpickler.load(Unpickler.java:84)
  at Test.main(Test.java:13)