1

我正在尝试提高我的二进制 IO 技能,因此正在编写一个简单的实用程序,它可以读取 mobi 格式的电子书并打印前 32 个字节以显示书名。

Palm 数据库格式声明二进制文件的前 32 个字节包含数据库/书籍名称,并且该名称以 0 结尾。

我不确定如何检查我读取的字节是否为空终止。

File file = new File("ebook.mobi");
DataInputStream in = new DataInputStream(new FileInputStream(file));

int count = 1;
while(count++ <= 32){
    System.out.print((char)in.readByte());
}       
in.close();

在这种情况下,输出打印:

Program_or_Be_Programmed <--- this is immediately followed by a number of square symbols

我试图改变while循环无济于事:

while(count++ < 32 || in.readByte != 0)

我想添加一些语句以在遇到 0 字节时停止循环打印字符。

我将如何实现这一点?

4

2 回答 2

1
while(count++ < 32 || in.readByte != 0)

由于您想在字节为零时停止,因此应该是

while(count++ < 32 && in.readByte() != 0)

但是如果你想在循环体中使用它,你还需要将字节存储在某个地方,因为你不能再次调用 readByte() (不推进流)。

我会做

 while(count++ <= 32){
     byte c = in.readByte();
     if (c == 0)
        break;
     System.out.print((char)c);

 }       
于 2013-09-30T11:08:34.800 回答
1

这是您说您尝试的代码:

while(count++ <= 32 || in.readByte != 0){
    System.out.print((char)in.readByte());
}       

DataInputStream 被读取两次,一次是在布尔检查中,一次是在正文中。

尝试:

byte b = 0;
while(++count < 32 && (b=in.readByte()) != 0){
    System.out.print((char)b);
} 

请注意,++count 比 count++ 占用更少的资源,因为它不会创建重复项。

要回答您关于空字节的问题:ascii (NUL) 中的 null,当显示为符号时,'\0' 由值 0 表示。它是行尾 (EOL) 字符,并自动附加到字符串。

进一步来说:

char c = '\0';
byte b = (byte) c; //b == 0
于 2013-09-30T11:10:01.303 回答