`
san_yun
  • 浏览: 2662483 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

PushbackInputStream的一个小bug

 
阅读更多
在前面java socket那篇文章中我提到netty使用PushbackInputStream来解决IO阻塞的问题。今天遇到一个错误使用PushbackInputStream导致的小BUG,花费了一点时间,所以记录一下。我的代码:
        public void run() {
            Socket socket = this.socket;
            PushbackInputStream input = null;
           
            while (true) {
                try {
                    
                	input = new PushbackInputStream(socket.getInputStream(), 1);
                    int bytesToRead = input.available();
                    byte[] buf;
                    String buffer;
                    int readBytes;
                    if (bytesToRead > 0) {
                        buf = new byte[bytesToRead];
                        readBytes = input.read(buf);
                    } else {
                        int b = input.read();
                        if (b < 0) {
                            break;
                        }
                        input.unread(b);
                        continue;
                    }
                    
                    System.out.println(readBytes);
                    System.out.println(buf.length);
                    buffer = new String(buf);
                    String result = t.test(buffer);
                    OutputStream out = socket.getOutputStream();
                    out.write(("ok" + result + "\r\n").getBytes());
                    out.flush();
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
            try {
                System.out.println("colse");
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } 


这段代码能运行,但多次调用之后会出现数据丢失的问题,刚好第一个byte丢掉了。原因是我没有理解PushbackInputStream的用法。
new PushbackInputStream(socket.getInputStream(), 1);
这里面的1表示每次只读取一个字节。那么在具体读数据的时候:
int b = input.read();
if (b < 0) {
    break;
}
input.unread(b);
continue;

b返回读到的数据,如果大于0表示有新数据进来了,那么我们通过unread返回给inpustream,然后continue。所以回到前面的代码,不应该在while循环里面new PushbackInputStream(),而应该放在while循环外面。
分享到:
评论

相关推荐

    java中的回退流1

    在Java编程语言中,`PushbackInputStream`是一个用于处理输入流的类,它提供了一种回退(或称为退格)的功能。这个类是`java.io`包的一部分,主要用于在读取数据后允许将数据“推回”到流中,以便后续的读取操作可以...

    Java字节流与字符流的介绍.pdf

    5. SequenceInputStream:从两个或多个低级流中读取数据字节,当到达流的末尾时从一个流转到另一个流 6. System.in:从用户控制台读取数据字节 InputStream 还有一个子类:过滤器流 java.io.FilterInputStream。...

    common.io详细说明

    - **ByteArrayInputStream**:从一个字节数组创建一个输入流。 - **StringBufferInputStream**:从一个字符串创建一个输入流。 - **FileInputStream**:从一个文件创建一个输入流。 - **PipedInputStream**:...

    Javaio流思维导图

    Java I/O 流是Java平台中的一个重要组成部分,它在处理数据输入和输出方面扮演着核心角色。I/O流系统提供了一种标准化的方式来读取、写入数据,无论是从磁盘、网络、内存还是其他类型的输入输出设备。在这个思维导图...

    java解压linux上的压缩文件gz格式文件

    首先,我们来看一个基本的例子,该例子展示了如何使用 `GZIPInputStream` 类来读取并解压 `.gz` 文件。下面的代码片段展示了这一过程: ```java try { // 打开压缩文件 String inFilename = "infile.gzip"; ...

    JDK_API_1_6

    PushbackInputStream PushbackInputStream 为另一个输入流添加性能,即“推回 (push back)”或“取消读取 (unread)”一个字节的能力。 PushbackReader 允许将字符推回到流的字符流 reader。 RandomAccessFile 此类...

    java输入输出流 流式输入与输出

    Java的I/O机制是基于流的,即数据以流的形式从一个地方传输到另一个地方。Java的I/O流分为两大类:字节流(Byte Stream)和字符流(Character Stream),并根据数据流向的不同,又可以分为输入流(InputStream和...

    java io一些探讨

    Java IO 支持文件锁定机制,通过`FileLock`类可以防止多个进程同时修改同一个文件,从而保证数据的一致性和完整性。 #### 六、后续可以探讨的问题 - 如何有效地处理大文件的读写操作? - 如何利用NIO的新特性来...

    IO流体系继承结构图_动力节点Java学院整理

    FilterInputStream作为一个抽象类,包含了另一个InputStream实例,这样就可以装饰已存在的流,增加新的功能。例如,BufferedInputStream可以提供缓冲能力,提高读取效率;DataInputStream支持读取基本数据类型;...

    资料课件\JAVA 上课幻灯\

    `PipedInputStream`和`PipedOutputStream`:用于线程间的通信,数据可以从一个线程的`PipedOutputStream`写入,另一个线程的`PipedInputStream`读取。 `SequenceInputStream`:允许将多个输入流连接在一起,如同一...

    Java IO口解析(初级)

    - **`FileInputStream`**:从一个文件创建输入流,用于读取文件中的数据。 - **`PipedInputStream`**:与 `PipedOutputStream` 配合使用,实现线程间的通信。 - **`SequenceInputStream`**:合并多个输入流为一个...

    Java解决UTF-8的BOM问题

    在Java编程中,UTF-8编码是一个非常常见且广泛使用的字符编码格式,它能支持全球大部分语言的字符表示。然而,UTF-8有一个特殊特性,那就是它可以带有Byte Order Mark(BOM),这是一个特殊的字节序列,用于标识数据...

    java的IO流操作

    - **`PushbackInputStream`**:允许将一个或几个读取的字节放回输入流中。 ##### 2. FilterOutputStream及其子类 - **`DataOutputStream`**:用于向`OutputStream`写入基本数据类型。 - **`BufferedOutputStream`*...

    彻底明白 Java 语言中的IO系统

    Java IO系统是Java编程中的一个重要组成部分,它负责处理程序与外部资源(如文件、网络等)之间的数据交换。Java IO的设计以流为基础,可以分为输入流(Input Stream)和输出流(Output Stream)两大类。 ##### 1.1...

    Java,彻底明白Java语言中的IO系统

    - `PushbackInputStream`:允许将一个字节压回输入流。 - **字符流过滤器**: - `BufferedReader`:为字符流提供缓冲机制,提高读取效率。 - `LineNumberReader`:记录字符流中行号的位置。 - `PushbackReader`...

    教你彻底明白Java的IO系统

    - **SequenceInputStream**:将多个输入流合并为一个输入流,可以连续读取多个输入流中的数据。 ##### 2. 输出流(OutputStream) - **ByteArrayOutputStream**:将数据写入内存中的字节数组。适合于需要缓存数据...

    大学生《JAVA》期末20套训练试卷(含答案,精心整理版).pdf

    3. 组合框(combobox)在Java中是由JComboBox类表示,它继承自JComponent类,并且它是由JList类派生过来的,但组合框不允许选择多个元素,缺省时也不可编辑,因此正确答案是C)组合框只允许选择一个元素。...

    java IO 类层次图

    Java IO(Input/Output)系统是Java平台中的一个重要组成部分,用于处理程序与外部设备之间的数据交换。Java IO系统提供了丰富的类来支持不同类型的输入输出操作,包括但不限于文件读写、网络通信等。本文将通过分析...

    bytestreamdemo.zip

    java IO 字节流练习代码 FileInputStream和FileOutputStream BufferedInputStream 和 BufferedOutputStream DataInputStream 和 DataOutputStream ObjectInputStream和ObjectOutputStream ...PushbackInputStream

Global site tag (gtag.js) - Google Analytics