【问题标题】:How to read a bytes file written in Java with Python如何使用 Python 读取用 Java 编写的字节文件
【发布时间】:2026-01-10 11:30:01
【问题描述】:

我在 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 字节的缓冲区”。

【问题讨论】:

  • "我无法在 Python 中正确读取文件" 你写的 Python 代码在哪里?运行时会发生什么?
  • AnObjectOutputStream 是 java 特定的存储类和对象(它们的属性等)。使用 DataOutputStream,并将整数读取为大端(或使用 ByteBuffer)
  • 您在 Python 中根本无法读取这些数据。仅在 Java 中。
  • 最大的问题是您询问了一个字节文件,但您甚至没有制作一个 int 文件。我能想到的最好的方法是用网络字节顺序以字节为单位写入文件。

标签: java arrays file byte


【解决方案1】:

感谢 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]

【讨论】: