# InputStream ließt nur 65536 Zeichen anstatt ganzer Puffer



## anfänger15 (25. Apr 2008)

Hallo

mir ist aufgefallen, dass wenn ich mit einem InputStream übers Netzwerk mit read etwas lese und dabei einen Puffer von 1048576 verwende er immer nur 65536 zeichen einließt.


Kann man dies irgendwie ändern oder ist das hardwarebedingt?


```
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class SaveFile extends Thread {

   private String dateiName;

   private static int BUFFERSIZE = 100000;
   
   private long dateigröße;

   private InputStream in;

   public SaveFile(String dateiName, long dateigröße, InputStream in) {
      this.dateigröße = dateigröße;
      this.dateiName = dateiName;
      this.in = in;
   }

   public void run() {
      if (dateiName.equals("no Datei")) {
         System.out.println("keine gültige Datei");

      } else {

         try {

            FileOutputStream f = new FileOutputStream(new File(dateiName));

            try {
               byte[] buffer;
               
               if(dateigröße>= BUFFERSIZE){
                  buffer = new byte[BUFFERSIZE];
                  }else{
                     buffer = new byte[(int)dateigröße];
                  }
               
               int größe = 0;
               System.out.println("");
               int read;
               while ((größe <dateigröße)
                     && ((read = in.read(buffer)) != -1)) {
                  f.write(buffer, 0, read);
                  größe += read;
System.out.println(read);

                     if (dateigröße <größe+BUFFERSIZE ){
                        if(dateigröße != größe){
                        
                        buffer = new byte[(int)dateigröße-größe];
                        
                        if ((read = in.read(buffer)) != -1){
                        f.write(buffer, 0, read);
                        größe += read;
                        
                        
                        größe += BUFFERSIZE;
                        }
                        }
                     }
                  

               }
               
            
               f.flush();

               System.out.println("Dateiübertragung erfolgreich");
               System.out
                     .println("__________________________________________________________________________");
               System.out.println("");
               f.close();
            } catch (FileNotFoundException e) {
               System.out.println(e);
            }
         } catch (IOException e) {
            System.out.println(e);

         }
      }
   }

}
```


danke


----------



## Marco13 (26. Apr 2008)

Sieht erstmal unnötig kompliziert aus. Der Buffer muss wohl nicht so groß sein, und ihn von der Größe der Datei abhängig zu machen ist i.a. auch nicht nötig. Was aber schon an Unfug grenzt, ist, für das letzte Stück nochmal einen neuen Buffer mit passender Größe zu erstellen. Versuch' vielleicht mal, das ganze in eine statische Methode (mit einer Schleife und ... *grobschätz* vielleicht 8 oder 9 Zeilen zu schreiben. Dann sollten solche Sachen wie
größe += read;
größe += BUFFERSIZE; 
auch nicht mehr vorkommen (die größe braucht man i.a. nicht zu kennen - man liest einfach den InputStream leer, und gut - wenn man nicht nur einen Teil des Inputs wieder rausschreiben will). Und WENN du solche Stellen hast, wo zwei mal hintereinader die Dateigröße um einen festen aber beliebigen Wert erhöht wird, dann schreib' notfalls sowas dazu wie

System.out.println("Größe ist "+größe+" gelesen: "+read+", addiere...");
größe += read;
System.out.println("Größe ist jetzt "+größe+", addiere nochmal den Buffersize - kann ja nicht schaden...");
größe += BUFFERSIZE; 
System.out.println("Größe ist jetzt "+größe);


----------



## anfänger15 (26. Apr 2008)

Meiner Meinung nach muss das leider so sein außer du kennst da eine bessere alternative.

Das Problem ist das ich den Stream nicht "leer lesen" kann, da eine Datei übertragen wird und irgendwann nach einer Weile nochmal. Ich könnte den Stream schließen dabei verliere ich aber dann die Verbindung zwischen Server und Client, deshalb erzeuge ich  ganz am Schluss in der If Schleife einen neuen Puffer mit der Größe, die noch fehlt damit die Datei vollständig ist, da sonst der Client ewig warten würde bis der Puffer wieder voll ist. Dies geschieht aber erst nach einer längeren Zeit wenn eine neue Datei gesendet wird. Ich benötige also nur einen Teil des Streams.

Gibt es da andere Möglichkeiten um dies zu lösen?
Wie wird das normalerweise gemacht?


danke


----------



## SlaterB (26. Apr 2008)

du kannst auch den alten Buffer nehmen aber vorgeben, wieviele Zeichen gelesen werden sollen (weitere Parameter),
hat mit der Ursprungsfrage aber nix zu tun


----------



## anfänger15 (26. Apr 2008)

SlaterB hat gesagt.:
			
		

> du kannst auch den alten Buffer nehmen aber vorgeben, wieviele Zeichen gelesen werden sollen (weitere Parameter),
> hat mit der Ursprungsfrage aber nix zu tun



stimmt ich kann read ja noch die Parameter der zu lesenden Zeichen übergeben.

Aber zurück zum eigentlichen Problem.


----------



## Marco13 (29. Apr 2008)

```
import java.io.*;

class SaveFileTest
{
    public static void main(String args[]) throws Exception
    {
        final PipedOutputStream out = new PipedOutputStream();
        InputStream in = new PipedInputStream(out);
        SaveFile saveFile = new SaveFile("test.txt", 100000, in);
        saveFile.start();

        Thread t = new Thread(new Runnable()
        {
            public void run()
            {
                try
                {
                    System.out.println("Writing");
                    for (int i=0; i<10102; i++)
                    {
                        out.write(("Test "+i+"\n").getBytes());
                        out.flush();
                    }
                    out.close();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });
        t.start();

    }
}


class SaveFile extends Thread
{

    private String dateiName;

    private static int BUFFERSIZE = 100000;

    private long dateigröße;

    private InputStream in;

    public SaveFile(String dateiName, long dateigröße, InputStream in)
    {
        this.dateigröße = dateigröße;
        this.dateiName = dateiName;
        this.in = in;
    }

    public void run()
    {
        if(dateiName.equals("no Datei"))
        {
            System.out.println("keine gültige Datei");

        }
        else
        {
            try
            {
                FileOutputStream f = new FileOutputStream(new File(dateiName));
                byte[] buffer = new byte[BUFFERSIZE];

                long left = dateigröße;
                int read;
                while(left > 0 && (read = in.read(buffer, 0, (int)left)) != -1)
                {
                    f.write(buffer, 0, read);
                    left -= read;
                    System.out.println("Read "+read+", missing "+left);
                }

                f.flush();

                System.out.println("Dateiübertragung erfolgreich");
                System.out.println("__________________________________________________________________________");
                System.out.println("");
                f.close();
            }
            catch(Exception e)
            {
                System.out.println(e);

            }
        }
    }

}
```


----------



## SlaterB (29. Apr 2008)

das Problem ist der 'InputStream aus dem Netzwerk',
dass es mit einem beliebigen Stream geht fiel mir auch schon mal auf 
http://www.java-forum.org/de/viewtopic.php?p=407464

edit: ok, zu schnell, dein Stream macht ja auch nur kleine Sprünge


----------



## Marco13 (30. Apr 2008)

Oh ja, bin jetzt nicht so der Netwerkexperte ... wenn da in der Praxis irgendwelche Probleme auftreten ... *schulernzuck* vielleicht irgendwo nen BufferedInput/OutputStream drumwickeln oder so...


----------



## anfänger15 (30. Apr 2008)

ok werd das mit den gepufferten Streams mal testen.

vllt kennt sich ja jemand gut mit dem Netzwerk aus und könnte sich noch melden.

danke


----------

