Java - 从文件中读取混合数据类型(char + int + binary)

时间:2016-09-06 06:41:24

标签: java android file io

我正在从文件中读取数据(实际上是一个fifo管道)。

格式如下

SECTION_NAME
SECTION_SIZE
SECTION_DATA[SECTION_SIZE]
.....

实施例

pps_frame
1404
<Binary data of 1404 bytes>
sps_frame
1000
<Binary data of 1000 bytes>
...

如何在上面的示例中读取1404字节的二进制数据。请注意,SECTION_SIZE会不断变化。

PS:在我的本机代码中,我将这些数据写入管道。

1 个答案:

答案 0 :(得分:1)

不幸的是,这确实有点间接:首先阅读文本,然后是二进制数据。这是一个解决方案,保持二进制阅读。

FileInputStream fin = ...
BufferedInputStream bin = new BufferedInputStream(fin, 2048);
String name = readLine(bin);
String lineWithSize = readLine(bin);
int size = Integer.parseInt(lineWithSize);
byte[] data = new byte[size];
bin.read(data, 0, size);
bin.close();

使用帮助函数readLine来读取字节,并将它们转换为文本。 作为BufferedReader.readLine,它会丢弃行结尾,这里遵循简化的假设,即行结尾是LF或CR + LF。

String readLine(BufferedInputStream bin) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    for (;;) {
        int ch = bin.read();
        if (ch == -1) {
            break;
        }
        if (ch == '\r' || ch == '\n') {
            if (ch == '\r') {
                bin.read();
            }
            break;
        }
        baos.write(ch);
    }
    return baos.toString("ISO-8859-1"); // Basic Latin-1 encoding.
}

使用Reader读取文本总是使用这些字节的某些编码进行字节转换。其内部Unicode(char是两个字节UTF-16)。因此,您无法100%完美地将字节读入字符串。由于尺寸和转换,它甚至不可取。