2013-10-08 61 views
10

为什么我收到以下异常:PushbackInputStream:推回缓冲区已满

Exception in thread "main" java.io.IOException: Push back buffer is full 
    at java.io.PushbackInputStream.unread(PushbackInputStream.java:232) 
    at java.io.PushbackInputStream.unread(PushbackInputStream.java:252) 
    at org.tests.io.PushBackStream_FUN.read(PushBackStream_FUN.java:32) 
    at org.tests.io.PushBackStream_FUN.main(PushBackStream_FUN.java:43) 

在此代码:

public class PushBackStream_FUN { 
    public int write(String outFile) throws Exception { 
     FileOutputStream outputStream = new FileOutputStream(new File(outFile)); 
     String str = new String("Hello World"); 
     byte[] data = str.getBytes(); 
     outputStream.write(data); 
     outputStream.close(); 

     return data.length; 
    } 

    public void read(String inFile, int ln) throws Exception { 
     PushbackInputStream inputStream = new PushbackInputStream(new FileInputStream(new File(inFile))); 
     byte[] data = new byte[ln]; 
     String str; 

     // read 
     inputStream.read(data); 
     str = new String(data); 
     System.out.println("MSG_0 = "+str); 
     // unread 
     inputStream.unread(data); 
     // read 
     inputStream.read(data); 
     str = new String(data); 
     System.out.println("MSG_1 = "+str); 
    } 

    public static void main(final String[] args) throws Exception { 
     PushBackStream_FUN fun = new PushBackStream_FUN(); 
     String path = "aome/path/output_PushBack_FUN"; 
     int ln = fun.write(path); 
     fun.read(path, ln); 
    } 
} 

UPDATE

认为这是解决方案。 Java消息来源援救。我做了一些“实验”。事实证明,当我指定PushbackInputStream与指定的缓冲区大小它的作品。 Java源代码告诉我这一点:

public PushbackInputStream(InputStream in) { 
     this(in, 1); 
    } 

public PushbackInputStream(InputStream in, int size) { 
     super(in); 
     if (size <= 0) { 
      throw new IllegalArgumentException("size <= 0"); 
     } 
     this.buf = new byte[size]; 
     this.pos = size; 
    } 

我认为,如果你使用PushbackInputStream与使用默认的缓冲区大小,你只能读一个字节constrcutor。我不读超过单个字节,因此是例外。

+0

你为什么写这个代码?你为什么要读书,然后再读相同的东西? – EJP

+1

它只是一个例子,易于其他用户阅读和复制。 SSCCE – alien01

回答

11

默认情况下,PushbackInputStream只分配足够的空间以便能够为单个字符unread()。如果您希望能够推回更多,则必须在施工时指定容量。

在你的情况下,它会是这个样子:

final PushbackInputStream pis = new PushbackInputStream(inputStream, ln); 
+0

非常感谢,这是为我做的! –