2014-01-22 10 views
5

Angenommen, ich habe eine Methode, die einen InputStream aufnimmt.Auswirkung auf den ursprünglichen InputStream nach dem Umbrechen mit BufferedInputStream

Diese Methode muss diesen InputStream mit einem BufferedInputStream umhüllen, um die Funktion zum Markieren und Zurücksetzen zu verwenden. Der übergebene InputStream wird jedoch möglicherweise weiterhin vom Aufrufer der Methode verwendet.

public static void foo(InputStream is) throws Exception { 
    BufferedInputStream bis = new BufferedInputStream(is); 
    int b = bis.read(); 
} 

public static void main(String[] args) { 


    try { 
     InputStream is = new FileInputStream(someFile); 
     foo(is); 
     int b = is.read(); // return -1 
    }catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Meine Fragen ist: Was genau das Original Input passieren, wenn die BufferedInputStream gelesen (oder initialisiert)?

Meine Annahme ist, dass der ursprüngliche InputStream auch weitergeht, wenn der BufferedInputStream gelesen wird. Nach dem Debuggen meines Codes habe ich jedoch festgestellt, dass der InputStream beim Lesen -1 zurückgibt.

Wenn die ursprüngliche Input nach einem solchen Verfahren nicht lesbar ist, wie soll ich tun, um mein Ziel zu erreichen:

InputStream is; 
foo(is);    // Method only take in generic InputStream object 
         // Processing of the passed in InputStream object require mark and reset functionality 
int b = is.read();  // Return the next byte after the last byte that is read by foo() 

EDIT: Ich nehme an, was ich fragen, ganz allgemein ist und deshalb erfordert viel der Arbeit. Was das betrifft, an dem ich arbeite, brauche ich nicht die volle Markierung & Reset-Fähigkeit, so dass ich eine kleine Arbeit gefunden habe. Ich werde jedoch den zweiten Teil der Frage hier lassen, also zögern Sie nicht, dieses Problem zu versuchen :).

Antwort

1

Die Standard-Puffergröße von BufferedInputStream ist 8192. Wenn Sie also von BufferedInputStream lesen, versucht es, den Puffer zu füllen. Also, wenn Sie von Ihrem InputStream weniger Bytes zu lesen, als die bufferSize, dann wird der gesamte Inhalt Ihres InputStream in den Puffer gelesen, deshalb sind Sie immer -1, nachdem sie von BufferedInputStream Lesen

einen Blick auf die Haben BufferedInputStream Quellcode: http://www.docjar.com/html/api/java/io/BufferedInputStream.java.html

0

http://docs.oracle.com/javase/7/docs/api/java/io/BufferedInputStream.html#BufferedInputStream%28java.io.InputStream%29

Sieht aus wie die BufferedInputStream die Input für die Aktionen mit dem Datenstrom durchgeführt verwendet. Die Buffered-Klasse implementiert einfach ein Puffer-Array für den internen Gebrauch.

Nicht sicher, was Sie stattdessen verwenden könnten, abgesehen davon, dass Sie möglicherweise den InputStream kopieren, damit Sie ein zweites Objekt aufrufen können.

0

BufferedInputStream wird Vorbelastung Daten aus den zugrundeliegenden InputStream in Chargen, die jeweilige Bewegung der darunterliegenden InputStream Position auslöst. Wenn die Puffergröße ausreicht, um alle Daten aus dem zugrunde liegenden Stream auf einmal zu konsumieren, können Sie das von Ihnen beschriebene Verhalten gut beobachten.

0

Zwei Dinge:

  1. Jede API, die einen Strom als Eingangsparameter akzeptiert wird wahrscheinlich diesen Strom verwenden würde, so dass es unvernünftig ist, dass der Anrufer den Strom zu erwarten in jeder Art von benutzbaren Zustand zu bleiben . Vielleicht wäre es besser gewesen, wenn die Java-Stream-Klassen ein einzelnes Eigentumsrecht durchsetzen würden, um das klarer zu machen.

  2. Als besonderen Fall wird BufferedInputStream den zugrundeliegenden Datenstrom verwenden, den es "umschließt", weil es eine begrenzte Form von Markierung erreicht und durch Blockieren von Blocklesevorgängen zurückgesetzt wird, wie andere darauf hingewiesen haben.

0
private static class MybufferedInputStream extends BufferedInputStream { 
    public MybufferedInputStream(InputStream in) { 
     super(in); 
    } 

    public int getBufferSize(){ 
     int i=0; 
     for (Byte byte1 : super.buf) { 
      if (byte1!=0) { 
       i++; 
      } 
     } 
     return i; 
    } 
} 

dann können Sie das getBufferSize() nach read() rufen Sie den Unterschied zwischen einer kleinen Datei und einer größeren Datei zu sehen.