Java PushbackInputStream
当我们解析来自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个字节,然后才能再次读取它们。
读取字节
我们可以通过JavaPushbackInputStream
的read()
方法读取字节,就像从常规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"实例也将关闭。