2013-10-08 19 views
10

Dlaczego otrzymuję następujący wyjątek:PushbackInputStream: Odsunąć bufor jest pełny

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) 

W tym kodzie:

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

że jest to rozwiązanie. Źródła Java na ratunek. Zrobiłem kilka "eksperymentów". Okazuje się, że gdy podam PushbackInputStream z określonym rozmiarem bufora, to działa. Źródła java mówi mi tak:

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; 
    } 

Myślę, że jeśli używasz PushbackInputStream z constrcutor który wykorzystuje domyślny rozmiar bufora, można tylko nieprzeczytane pojedynczy bajt. Nieobsługiwam więcej niż jeden bajt, a więc wyjątek.

+0

Dlaczego piszesz ten kod? Dlaczego czytasz i czytasz te same rzeczy ponownie? – EJP

+1

To tylko przykład, łatwy do odczytu i odtwarzania przez innych użytkowników. SSCCE – alien01

Odpowiedz

11

Domyślnie PushbackInputStream przydziela tylko tyle miejsca, aby można było uzyskać unread() dla pojedynczego znaku. Jeśli chcesz mieć możliwość odepchnięcia więcej, musisz określić pojemność w czasie budowy.

W twoim przypadku będzie wyglądało mniej więcej tak:

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

Wielkie dzięki, ten zrobił to za mnie! –