Java PushbackInputStream

时间:2020-01-09 10:36:06  来源:igfitidea点击:

当我们解析来自InputStream的数据时,将使用" PushbackInputStream"。有时,在确定如何解释当前字节之前,我们需要先阅读一些字节以查看即将发生的事情。 PushbackInputStream可以做到这一点。好吧,实际上,它允许我们将读取的字节推回流中。这些字节将在我们下次调用read()时再次读取。

JavaPushbackInputStream是Java InputStream的子类,因此它继承了其公共方法read()close()等。PushbackInputStream与Java PushbackReader类似,不同之处在于PushbackInputStream读取原始字节。 ,然后PushbackReader读取字符(文本)。

PushbackInputStream示例

这是一个简单的" PushbackInputStream"示例:

PushbackInputStream input = new PushbackInputStream(
                                new FileInputStream("c:\data\input.txt"));

int data = input.read();

input.unread(data);

对read()的调用就像从InputStream一样读取一个字节。对unread()的调用将一个字节推回到PushbackInputStream中。下次调用read()时,将首先读取回退的字节。如果我们将多个字节回推到" PushbackInputStream"中,则最后一次回推的字节将从" read()"中首先返回,就像在堆栈上一样。

创建一个PushbackInputStream

要使用JavaPushbackInputStream,必须首先创建PushbackInputStream实例。这是创建JavaPushbackInputStream的示例:

PushbackInputStream input = new PushbackInputStream(
                                new FileInputStream("c:\data\input.txt"));

请注意PushbackInputStream如何需要另一个InputStream作为其构造函数的参数。 " PushbackInputStream"将从该基础" InputStream"中读取其字节。

设置PushbackInputStream的推回限制

我们可以在PushbackInputStream的构造函数中设置我们应该能够读取的字节数。这是通过PushbackInputStream构造函数设置推回限制的方法:

int pushbackLimit = 8;
PushbackInputStream input = new PushbackInputStream(
                                new FileInputStream("c:\data\input.txt"),
                                pushbackLimit);

本示例将内部缓冲区设置为8个字节。这意味着我们一次最多只能读取8个字节,然后才能再次读取它们。

读取字节

我们可以通过JavaPushbackInputStreamread()方法读取字节,就像从常规InputStream中读取字节一样。这是一个从PushbackInputStream中读取字节的示例:

int aByte = pushbackInputStream.read();

while(aByte != -1) {
    //do something with aByte
    byte byteRead = (byte) aByte;

    aByte = pushbackInputStream.read();
}

注意,一旦" PushbackInputStream"没有更多的字节要读取,则从其底层的" PushbackInputStream"中," read()"方法将返回-1.

向后推一个字节

要将字节推回JavaPushbackInputStream,请使用unread()方法。这是将一个字节推回PushbackInputStream的示例:

int aByte = pushbackInputStream.read();

pushbackInputStream.unread(aByte);

aByte = pushbackInputStream.read()

此示例首先从" PushbackInputStream"中读取一个字节,然后将其推回" PushbackInputStream"中,然后通过最终的" read()"调用再次读取该字节。

关闭PushbackInputStream

当我们从JavaPushbackInputStream中读取完字节后,我们应该记得将其关闭。关闭PushbackInputStream也将关闭PushbackInputStream正在读取的InputStream实例。

关闭" PushbackInputStream"是通过调用其" close()"方法完成的。这是关闭PushbackInputStream的样子:

pushbackInputStream.close();

我们还可以使用Java 7中引入的try-with-resources构造。这是如何使用try-with-resources构造使用和关闭" PushbackInputStream"外观的方法:

InputStream inputStream = new FileInputStream("data/data.bin");

try(PushbackInputStream pushbackInputStream =
    new PushbackInputStream(inputStream)){

    int data = pushbackInputStream.read();
    while(data != -1) {
        byte aByte = (byte) data;
        data = pushbackInputStream.read();
    }
}

请注意,不再有任何显式的close()方法调用。 try-with-resources构造可以解决这一问题。

还要注意,没有在try-with-resources块内创建第一个FileInputStream实例。这意味着try-with-resources块不会自动关闭此FileInputStream实例。但是,当关闭" PushbackInputStream"时,也会关闭其读取的" InputStream"实例,因此,当" PushbackInputStream"关闭时," FileInputStream"实例也将关闭。