Problem mit der Methode available() der Klasse InputStream



  • Hallo zusammen,

    ich habe ein InputStream, dass meine Bilddaten beinhaltet. Ich würde gerne aus diesem InputStream wieder mein Bild herstellen! Deshalb benötige ich die Daten als byte[]. Wie kann ich genau feststellen, wie viele bytes dieses Stream hat?

    Ich verwende momentan die Methode available(), aber dadurch fehlen mir noch einige bytes, um das Bild wieder herstellen zu können!

    byte buf[] = new byte[in.available()]; // Gibt hier andere alternative ??
    Ich würde gerne wissen, ob einen ArrayBuffer existiert, dass ich benutzen kann, um das Array dynamisch zu vergrössern!?! Dadurch kann ich zur Laufzeit das ArrayBuffer vergrössern, wenn das InputStream mehr bytes liefert!

    Danke



  • a) nein, es gibt keine Alternativen. Wenn man bei einem Stream beginnt zu lesen, kann jemand anders auf der anderen Seite immernoch am reinschreiben sein...

    b) Wenn du von einer Datei liest, guck dir "File.getLength()" an.

    c)

    byte[] array = new byte[ 1024 ];
    int index = 0;
    while( ... ){
      if( index == array.length ){
        byte[] temp = new byte[ array.length*2 ];
        System.arraycopy( array, 0, temp, 0, array.length );
        array = temp;
      }
      array[ index++ ] = ...
    }
    


  • Hallo JBeni,

    ich lese aus der Datenbank. getBinaryStream(...)

    Was soll im Schleifen-rumpf stehen?

    So oder ?

    while(int ret(in.read(buf)) != -1)
    {
      .....
    
     array[ index++ ] = ret;  // ist das richtig so?
    }
    

    Vielen Dank 🙂



  • Ich würde das mit nem ByteArrayOutputStream machen:

    InputStream input = bla bla;
    ByteArrayOutputStream arr = new ByteArrayOutputStream();
    byte[] buffer = new byte[ 4096 ];
    int len = 0;
    while( (len = input.read( buffer ) ) != -1 )
         arr.write( buffer, 0, len );
    
    byte[] data = buffer.toByteArray();
    System.out.println( "Gelesen: " + data.length );
    

    nicht getestet, müsste aber gehen...
    http://java.sun.com/j2se/1.4.2/docs/api/java/io/ByteArrayOutputStream.html



  • Hallo zusammen,

    ich habe den Tipp von JBeni genommen und das hat geholfen 😉

    byte[] array = new byte[ 1024 ]; 
    int index = 0;
    int ret = 0; 
    while( (ret = in.read() != -1) ){ 
      if( index == array.length ){ 
        byte[] temp = new byte[ array.length*2 ]; 
        System.arraycopy( array, 0, temp, 0, array.length ); 
        array = temp; 
      } 
      array[ index++ ] = (byte) ret; 
    }
    

    Ich habe nur noch eine allgemeine Frage.
    Was ist der Unterschied z.w.

    InputStream input = .....
    BufferedInputStream bin = input; // Referenz auf input
    

    und

    BufferedInputStream bin = new BufferedInputStream(input);
    

    Welcher Aufruf ist effizienter?

    Vielen Dank 🙂



  • Ganz einfach: das erste mit "bin = input" kompiliert nicht. 🤡
    Also bleibt nur das zweite. Ein BufferedInputStream ist (meist) effizienter: hast du z.B. Daten auf der Festplatte, kann der Buffered gleich einen grösseren Abschnitt einlesen, während der normale Stream bei jedem read wieder warten muss, bis die Festplatte zu dem benötigten byte hinrotiert ist...



  • OK. Dann spielt keine Rolle, wie ich das BufferedInputStream verwende!
    So bin = input oder so bin = new BufferedInputStream(input)!

    Ich habe am Anfang gedacht, man soll new BufferedInputStream(input) verwenden, weil durch new die Größe des BufferedInputStream definiert wird!!


Anmelden zum Antworten