Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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?
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);
}
}
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();
}
}
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