如何使用 Python 读取以 Java 编写的字节文件
How to read a bytes file written in Java with Python
我在 Java (Android) 中有两个单独的大型数组,类型为 short 和 int。我想将它们写在一个文件中,然后在 Python 中读取它们以重新创建数组。问题是,我认为文件已在 Java 中正确创建和写入,但我无法在 Python 中正确读取文件。
我在 Java 中使用以下代码位来编写数组。
File mFile = new File( this.getExternalFilesDir(null),"testFile.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(mFile));
objectOutputStream.writeObject(intArray);
objectOutputStream.close();
我还使用以下遍历数组的方法编写了文件(我认为这也很好用)
File mFile = new File( this.getExternalFilesDir(null),"testFile.txt");
OutputStream outputStream = new FileOutputStream(mFile);
for (int x: intArray) {
outputStream.write(x);
}
objectOutputStream.close();
如何读取此文件并在 python 中创建数组。我尝试引用 Python 结构库,但无法使用它。
我尝试使用以下代码读取 Python。
我尝试了一个演示数组
[1000, 1001, 1002, 1003,.....,1025]
with open('/../testFile.txt') as mFile:
for ln in mFile:
print( list( struct.unpack('I*'(len(ln)//4), ln) ) )
这会在打印语句中引发错误“错误:解包需要 104 字节的缓冲区”。
感谢 Joop Eggen 的评论,我修改了 Java 代码以使用 DataOutputStream 写入数据并使用 Big Endian 格式读取文件(我没有这样做,Joop Eggen 指出了这一点)。这是 Java 代码。
short[] mBuffer = {1000, 1001,....,1025};
ByteBuffer byteBuffer = ByteBuffer.allocate(mBuffer.length*2);
ShortBuffer sBuffer = byteBuffer.asShortBuffer();
sBuffer.put(mBuffer);
File mFile = new File( this.getExternalFilesDir(null),"testFile.txt");
OutputStream outputStream = new FileOutputStream(mFile);
outputStream.write(byteBuffer.array());
读取和创建数组的Python代码。
with open('\..\testFile.txt', 'rb') as mFile:
for ln in mFile:
# To Read Short Array
print( list( struct.unpack('>' + 'h'*(len(ln)//2), ln) ) )
# To Read Int Array
print( list( struct.unpack('>' + 'i'*(len(ln)//4), ln) ) )
Output : [1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024]
我在 Java (Android) 中有两个单独的大型数组,类型为 short 和 int。我想将它们写在一个文件中,然后在 Python 中读取它们以重新创建数组。问题是,我认为文件已在 Java 中正确创建和写入,但我无法在 Python 中正确读取文件。 我在 Java 中使用以下代码位来编写数组。
File mFile = new File( this.getExternalFilesDir(null),"testFile.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(mFile));
objectOutputStream.writeObject(intArray);
objectOutputStream.close();
我还使用以下遍历数组的方法编写了文件(我认为这也很好用)
File mFile = new File( this.getExternalFilesDir(null),"testFile.txt");
OutputStream outputStream = new FileOutputStream(mFile);
for (int x: intArray) {
outputStream.write(x);
}
objectOutputStream.close();
如何读取此文件并在 python 中创建数组。我尝试引用 Python 结构库,但无法使用它。 我尝试使用以下代码读取 Python。 我尝试了一个演示数组 [1000, 1001, 1002, 1003,.....,1025]
with open('/../testFile.txt') as mFile:
for ln in mFile:
print( list( struct.unpack('I*'(len(ln)//4), ln) ) )
这会在打印语句中引发错误“错误:解包需要 104 字节的缓冲区”。
感谢 Joop Eggen 的评论,我修改了 Java 代码以使用 DataOutputStream 写入数据并使用 Big Endian 格式读取文件(我没有这样做,Joop Eggen 指出了这一点)。这是 Java 代码。
short[] mBuffer = {1000, 1001,....,1025};
ByteBuffer byteBuffer = ByteBuffer.allocate(mBuffer.length*2);
ShortBuffer sBuffer = byteBuffer.asShortBuffer();
sBuffer.put(mBuffer);
File mFile = new File( this.getExternalFilesDir(null),"testFile.txt");
OutputStream outputStream = new FileOutputStream(mFile);
outputStream.write(byteBuffer.array());
读取和创建数组的Python代码。
with open('\..\testFile.txt', 'rb') as mFile:
for ln in mFile:
# To Read Short Array
print( list( struct.unpack('>' + 'h'*(len(ln)//2), ln) ) )
# To Read Int Array
print( list( struct.unpack('>' + 'i'*(len(ln)//4), ln) ) )
Output : [1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024]