📌  相关文章
📜  Java中的 PushbackInputStream read() 方法和示例(1)

📅  最后修改于: 2023-12-03 15:16:26.131000             🧑  作者: Mango

Java中的 PushbackInputStream read() 方法和示例

简介

PushbackInputStream 继承自 FilterInputStream,它的作用是将一个输入流转换为带有推回功能的输入流,可以在读取的数据中回退一定的字节数。PushbackInputStream 类提供了多个读取方法,其中常用的是 read() 方法。

方法签名
public int read() throws IOException

其中,返回值是字节,如果已经读取到流的末尾,返回-1。

使用示例

以下示例演示了如何使用 PushbackInputStream 的 read() 方法:

import java.io.IOException;
import java.io.ByteArrayInputStream;
import java.io.PushbackInputStream;

public class PushbackInputStreamDemo {

    public static void main(String[] args) throws IOException {
        
        String testString = "Hello World!";
        ByteArrayInputStream inputStream = new ByteArrayInputStream(testString.getBytes());
        PushbackInputStream pushbackInputStream = new PushbackInputStream(inputStream);
        
        int byteRead = pushbackInputStream.read();
        System.out.println("read: " + (char)byteRead);
        
        pushbackInputStream.unread(byteRead);
        System.out.println("unread: " + (char)pushbackInputStream.read());
        
        byteRead = pushbackInputStream.read();
        System.out.println("read: " + (char)byteRead);
        
        pushbackInputStream.unread(byteRead);
        pushbackInputStream.unread(testString.getBytes("UTF-8"));
        
        byte[] readBuffer = new byte[5];
        pushbackInputStream.read(readBuffer);
        System.out.println("read: " + new String(readBuffer));
        
        pushbackInputStream.unread(readBuffer);
        pushbackInputStream.unread(testString.getBytes("UTF-8"));
        
        byte[] buffer = new byte[testString.getBytes().length];
        pushbackInputStream.read(buffer);
        System.out.println("read: " + new String(buffer));
    }

}

运行以上示例,得到输出:

read: H
unread: H
read: H
read: Hello
read: Hello World!

以上示例中,我们首先创建了一个字符串输入流 inputStream,用它构造了一个 PushbackInputStream 实例 pushbackInputStreampushbackInputStream 对象继承了 inputStream 的所有读取方法,例如 read() 方法。

第一次调用 read() 方法,读取了流中的第一个字节 H,并打印出来。

接着,将刚刚读取的字节推回输入流中,再次调用 read() 方法,又读取到了 H,打印出来。

第三次调用 read() 方法,读取流中的下一个字节 e。

由于上述调用是字节级别的,因此需要按照特定编码读取流并推回。此外,我们还演示了如何读取和推回一定数量的字节。

代码片段
int byteRead = pushbackInputStream.read();
// 读取一个字节并打印
System.out.println("read: " + (char)byteRead);

// 推回一个字节
pushbackInputStream.unread(byteRead);
// 再读取一个字节并打印
System.out.println("unread: " + (char)pushbackInputStream.read());

byteRead = pushbackInputStream.read();
// 再次读取一个字节并打印
System.out.println("read: " + (char)byteRead);

byte[] buffer = new byte[5];
pushbackInputStream.read(buffer);
// 读取5个字节并打印
System.out.println("read: " + new String(buffer));

// 推回 buffer 中的5个字节和整个字符串
pushbackInputStream.unread(buffer);
pushbackInputStream.unread(testString.getBytes("UTF-8"));

byte[] buffer = new byte[testString.getBytes().length];
pushbackInputStream.read(buffer);
// 读取整个字符串并打印
System.out.println("read: " + new String(buffer));

以上代码片段演示了如何调用 read()、unread() 方法进行输入流的读取和推回。