Hallo,
ich bin beim erstellen eines "kleinen" Java Programms mal wieder auf ein paar kleine Schwierigkeiten gestoßen.
Ursprünglich wollte ich von einem Java Programm aus (lokal), über ein php Script (im Internet verfügbar) von beliebigen Sourcen, Daten downloaden. Hierzu ein kleines Schema, damit man mich hoffe ich auch versteht:
Java Programm (schickt Anfrage, z.B. "http://einserver/file.zip) -> http://phpserver/proxyscript.php (nimmt Anfrage entgegen, ließt von file.zip und gibt die Daten in 10 KB schritten an das Java Prog.)
Soweit so gut, nun die Probleme, ich kann zwar mit dem PHP Script die Datei an Java übergeben, da aber das ganze nicht am Stück geschieht sonder in 10 KB Paketen, muss das PHP Script, die Datei (file.zip) bei jedem neuen Zugriff an der aktuellen Stelle öffnen. Sprich es soll nicht immer von Beginn an gelsen werden, sondern erst von der Stelle wo das letzte Paket beendet wurde.
Bsp.: Zu Beginn ist der Startpunkt 0, dann 10240, dann 2*10240 ...
Das hatte ich mit fseek(Startpunkt) in PHP realisiert. Das dumme ist nur, das bei Filehandles die mit http:// beginnen, fseek nicht funktioniert. Könnte man das nicht anders lösen?
Desweiteren gibt es ein massives perfomance Problem, für eine poplige 200 KB Datei, die zu testzwecken vom lokalen Webserver geladen wurde, benötigt man schon ca. 10-20 sec. liegt evtl daran das ich alles Byteweise lesen und schreiben muss, da eine Zeilenweise übermittlung, bei Binärdaten wie zip Files etc. Schwachsinnig ist. Hab das Ganze auch mal direkt versucht, also Java Prog. -> Downloadquelle, war aber auch nicht schneller.
Wie könnte ich hier mehr perfomance herausholen?
Anbei, zwei kleine SourceCodes:
1. Java Code (direkter download, aber von der Methodik des InputStreams etc. äquivalent zur php variante)
URL url = new URL("http://localhost/file.zip");
InputStream is = url.openStream();
is.skip(fsize);
int rbytes = fsize;
int cbuf;
while ((cbuf = is.read()) != -1) {
out_file.write(cbuf);
}
2. PHP Code ($para, übergibt den Stratpunkt oder den Befehl "getSize" um die komplette größe der Datei zu ermitteln)
$buffer = "";
$fp = fopen("file.zip","r");
$cnt=-1;
$size = filesize("file.zip");
$start = $para;
if ($para != "getSize")
{
fseek($fp, $start);
while(($cnt < 10240) && (!feof($fp)))
{
$cnt++;
$buffer.=fgetc($fp);
}
echo ($buffer);
}
else
echo $size;
fclose($fp);
Über Verbesserungsvorschläge würde ich mich freuen ;-)
Gruß
ueps