英文:
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的struct库,但无法使用它。
我尝试了以下代码在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)))
在print语句处引发错误"error: unpack requires a buffer of 104 bytes"。
英文:
I have two separate large array of type short and int in Java (Android). I want to write them in a file and later read them in Python to recreate the array. The problem is, I think the file is created and written correctly in Java, but I am unable to read the file correctly in Python.
I am using following bits of code in Java to write the array.
File mFile = new File( this.getExternalFilesDir(null),"testFile.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(mFile));
objectOutputStream.writeObject(intArray);
objectOutputStream.close();
I also wrote the file using the following method looping over the array (which I think also works just fine)
File mFile = new File( this.getExternalFilesDir(null),"testFile.txt");
OutputStream outputStream = new FileOutputStream(mFile);
for (int x: intArray) {
outputStream.write(x);
}
objectOutputStream.close();
How do I read this file and create the array in python. I tried referring the Python struct library but was unable to use it.
I tries the following code to read in Python.
I tried a demo array
[1000, 1001, 1002, 1003,.....,1025]
with open('/../testFile.txt') as mFile:
for ln in mFile:
print( list( struct.unpack('I*'(len(ln)//4), ln) ) )
This raise Error "error: unpack requires a buffer of 104 bytes" at the print statement.
答案1
得分: 0
由于Joop Eggen的评论,我修改了Java代码,使用DataOutputStream写入数据,并使用大端格式读取文件(这是我之前没有做到的,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代码用于读取并创建数组。
import struct
with open('../testFile.txt', 'rb') as mFile:
for ln in mFile:
# 读取Short数组
print(list(struct.unpack('>' + 'h'*(len(ln)//2), ln)))
# 读取Int数组
print(list(struct.unpack('>' + 'i'*(len(ln)//4), ln)))
# 输出: [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]
英文:
Thanks to Joop Eggen's comment I modified the Java code to write data using DataOutputStream and read the file using Big Endian format (something I was not doing and Joop Eggen's pointed out). Here is the Java code.
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());
The Python code to read and create the array.
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]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论