InputStream ließt nur 65536 Zeichen anstatt ganzer Puffer

Status
Nicht offen für weitere Antworten.

anfänger15

Bekanntes Mitglied
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?

Code:
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

Top Contributor
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

Bekanntes Mitglied
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
 
S

SlaterB

Gast
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

Bekanntes Mitglied
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

Top Contributor
Code:
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);

            }
        }
    }

}
 

Marco13

Top Contributor
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

Bekanntes Mitglied
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
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Socket Wie kann man in Java die Anzahl der Objekte in einem InputStream sehen ohne ihn durchgehen zu müssen Netzwerkprogrammierung 1
S Socket String InputStream in hex umwandeln Netzwerkprogrammierung 1
D GZIP InputStream lesen ohne zu encoden Netzwerkprogrammierung 1
F Java Server Scanner oder InputStream kann nicht gelsesen werden! Netzwerkprogrammierung 6
R Socket InputStream readObject > Connection Reset Netzwerkprogrammierung 3
windl InputStream cachen Netzwerkprogrammierung 3
K Socket InputStream wird nicht erzeugt Netzwerkprogrammierung 4
M Socket InputStream liest nicht vollständig Netzwerkprogrammierung 7
M Was macht Thread, wenn er aus einem "leeren" Inputstream liest ? Netzwerkprogrammierung 5
K Byte für Byte aus InputStream lesen Netzwerkprogrammierung 5
F JSch - inputstream is closed Netzwerkprogrammierung 13
M Socket InputStream sendet ausgaben von OutputStream zurück Netzwerkprogrammierung 2
D Inputstream to Outputstream Netzwerkprogrammierung 3
M InputStream and ObjectInputStream zur gleichen Zeit Netzwerkprogrammierung 11
T Inputstream -> verschiedene Objekte lesen Netzwerkprogrammierung 3
MQue Inputstream Timeout Netzwerkprogrammierung 2
S Servlet InputStream leer?! Netzwerkprogrammierung 14
G HTTP-Request InputStream-Problem Netzwerkprogrammierung 5
P Inputstream "verfügbar" Netzwerkprogrammierung 4
G JPG im InputStream Netzwerkprogrammierung 2
A InputStream liest immer komplettes PHP-Script Netzwerkprogrammierung 6
A inputstream teilen? Netzwerkprogrammierung 4
D InputStream (Socket) mit BufferedInputStream puffern Netzwerkprogrammierung 2
M Sockets und InputStream Netzwerkprogrammierung 8
R Client nimmt den Inputstream nicht an Netzwerkprogrammierung 5
S Mail anhang in InputStream packen Netzwerkprogrammierung 5
M InputStream - Bytes gehen verloren? Netzwerkprogrammierung 3
E Problem bei Sockets/InputStream über externe Klasse Netzwerkprogrammierung 5
André B. In einen InputStream schreiben? Netzwerkprogrammierung 6
G inputstream hat plötzlich weniger inhalt Netzwerkprogrammierung 8
Z ProgressBar auf BufferedOutput- & -InputStream Netzwerkprogrammierung 2
B BufferedReader.readLine() ließt nicht vollständig ! ? Netzwerkprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben