我正在从文件(实际上是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:在我的本地代码中,我将这些数据写入管道。
不幸的是,这确实有点情况:首先读取文本,然后读取二进制数据。这里有一个解决方案,继续使用二进制读取。
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(一个字符是两个字节的UTF-16)。因此,您不能100%完美地将字节读取到String中。由于大小和转换的原因,它甚至不是理想的