Frage zu Puffergröße bei InputStream

Status
Nicht offen für weitere Antworten.

anfänger15

Bekanntes Mitglied
Hallo

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

Kann sein das dies der größtmögliche puffer in Java ist?
Kann man dies irgendwie ändern?


danke
 
das kann ich nicht nachvollziehen, erhalte in meinem Test die Ausgabe 100000, wenn die Datei groß genug ist

wie stellst du das denn fest?

Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        InputStream i = new FileInputStream("temp.txt");
        byte[] b = new byte[100000];
        int k = i.read(b);
        System.out.println(k);
    }

}
 
Hast du vielleicht auf beiden PCs unterschiedliche Java-Versionen installiert?
 
Ich verwende folgende selbst geschriebene Klasse um die Datei auf der Clientseite zu speichern.

An was kann es nun liegen, dass er immer nur 65536 Zeichen auf einmal ließt?

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

			}
		}
	}

}
 
ohne Informaion über dateiGröße und den InputStream in ist dein Programm nur teilweise hilfreich,
sieht für micht etwas komisch aus, das if in der Schleife ist doch unnötig und größe ist am Ende zu groß,
sollte aber den Buffer nicht stören

Code:
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];
                    }
                    System.out.println("dateigröße: " + dateigröße + ", " + buffer.length);

                    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 : " + 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)
                                {
                                    System.out.println("read2: " + read);
                                    f.write(buffer, 0, read);
                                    größe += read;
                                    größe += BUFFERSIZE;
                                }
                            }
                        }
                        System.out.println("größe: " + größe);
                    }
                    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);
            }
        }
    }

    public static void main(String[] args)
        throws Exception
    {
        File f = new File("test.txt");
        InputStream in = new FileInputStream(f);
        new SaveFile("save.txt", f.length(), in).start();
    }
}

Ausgabe bei mir:

dateigröße: 370638, 100000

read : 100000
größe: 100000
read : 100000
größe: 200000
read : 100000
read2: 70638
größe: 470638
Dateiübertragung erfolgreich
________________________________

was kommt bei dir bei einem Test raus?
aber das ist eigentlich egal, denn du hast ja ganz bestimmt schon mit meinem Programm getestet, nicht wahr?! 😉

also muss man über dieses Programm gar nicht nachdenken,
wenn mein einfaches bei dir nicht geht, dann musst du zwei merkwürdige Computer haben
 
dein Programm funktioniert bei mir!!

Ich kann mir daher nur vorstellen das es etwas mit dem versenden der Datei über das Netzwerk zu tuen hat da es lokal funktioniert.

Bei mir erhalte ich bis auf die letzte Ausgabe immer 65536 und die letzte ist eben so groß das die datei vollständig übertragen wird, jedoch sollten die vorigen Ausgabe anstatt 65536 der Puffergröße entsprechen.

Die if in der while schleife beendet die Schleife wenn das noch zu übertragende Dateistück kleiner wie die Puffergröße ist, da das Programm sonst darauf wartet bis der Server genügend Zeichen gesendet hat damit der Lesepuffer voll ist.
 
so machst natürlich Sinn, aber all das hättest du schon am Anfang schreiben können,
eine Datei aus dem Internet zu lesen..,
dann kannst du dich doch nicht über den allgemeinen InputStream beschweren,
dann hast du doch bestimmt einen ganz speziellen InternetInputStream 😉

da kann ich mir Sonderlocken gut vorstellen, aber nix genaues zu sagen,
such dir dochmal deinen genauen Code zusammen, was immer du da benutzt,
HTTPirgendwas, Socket? und stelle noch mal eine neue Frage im Netzwerkprogrammierung-Bereich,
wenn du die Einschränkung noch nicht akzeptieren kannst
 
Ich verwende einen Socket und das ganze läuft nicht übers internet sondern über ein Heimnetzwerk, was aber wohl nicht viel ändert.

Werde das ganze mal im Netzwerkprogrammierung-Bereich stellen (wie von dir vorgeschlagen).
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben