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

标签 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:在我的 native 代码中,我正在将这些数据写入管道。

最佳答案

不幸的是,这确实有点环境问题:首先读取文本,然后读取二进制数据。这是一个解决方案,保留二进制读取。

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.
}

使用阅读器读取文本始终会使用这些字节的某种编码进行字节转换。其内部的 Unicode(一个字符是两个字节的 UTF-16)。因此,您无法 100% 完美地将字节读取到字符串中。由于大小和转换,它甚至是不可取的。

关于Java - 从文件中读取混合数据类型(char + int + 二进制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39342155/

相关文章:

java - 具有起始值和最终值的进度组件

java - 公开课不公开?

javascript - 如何从绝对网络路径加载javascript文件

java - 独立的Java控制台输入法?

java - 为什么 java.util.Stack 允许 .add(int, E)?

java - JBoss 使用哪个 UUID/GUID 生成器

android - ListView 行中 ImageView 的圆角

android - MD在移动开发中意味着什么?

java - Zip 文件是使用 Windows 路径分隔符创建的

python - 在python中以特殊格式打印文件中的列表