Filesystem Vs JAR

Status
Nicht offen für weitere Antworten.

lumo

Top Contributor
hallo,

hab mir einen kleinen webserver geschrieben.
die files werden mittels dieser funktion retouriert:
Java:
	public static byte[] inputStreamAsByteArray(InputStream stream) {
		byte[] b = null;
		try {
			b = new byte[stream.available()];
			stream.read(b);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return b;
	}
wobei diese funktion so aufgerufen wird:
Java:
				try {
					byte[] b = inputStreamAsByteArray(this.getClass()
							.getResourceAsStream(request.getRequestHttpFile()));
					if (!silent)
					System.err.println("GET ~ requested file [" + request.getRequestHttpFile() + "] exists ["+b.length+"]bytes");
					out.write(b);
				} catch (IOException e) {
					e.printStackTrace();
				}

so weit so gut.
mein problem ist aber nun folgendes:
ich starte die anwendung in eclipse (ohne jar) alles funktioniert wie es soll...
nun packe ich die anwendung in eine jar file und starte die jar mal...
und nun passierts. PNG files werden anscheinend nicht korrekt entpackt -> jeder browser schreibt dass das bild korrupt ist... bei gif text etc funktionierts problemlos...

any ideas?
 

HoaX

Top Contributor
Schau halt mal was available() zurückliefert!
Btw ist es generell unratsam die ganze Datei erstmal in ein Array einlesen zu wollen, was ist wenn die Datei 100mb groß ist ...
 

lumo

Top Contributor
war die letzten tage krank, jetzt das erste mal die mails angeschaut...
werde meine files sind max 100kb groß, werde den rat mit dem array aber berücksichtigen, damits auch für große files sinn macht...
das mit dem available teste ich sobald ich mein IDE gestartet habe, weiss aber nicht ob sich das heute noch ausgeht (bin noch etwas wackelig unterwegs)

greets
lumo
PS: to be updated :) THX
 

lumo

Top Contributor
ok, available liefert mir bei ALLEN png files die dateigröße. also die files sind dort, wo sie gesucht (gefunden) werden.

hinweis: FF 3.5.1 schreibt:
Die Grafik "http://localhost:8080/images/goldstar.png" kann nicht angezeigt werden, weil sie Fehler enthält.

edit: hab auch schon versucht als content-type image/png vorweg zu senden...
ändert auch nichts am ergebnis

die quellfile ist übrigens nur 45x45pixel groß, ~5kb
edit: bin grad draufgekommen, dass andere png's funktionieren.
jedoch funktionieren drei der files nicht, egal was ich mache, auch wenn ich sie neu abspeichere. jedes andere programm öffnet sie normal (die files selbst sind also ok)
 
Zuletzt bearbeitet:
J

JohannisderKaeufer

Gast
Sag mal was out ist.
Damit mein ich jetzt nicht das gegenteil von in sondern das out in Teil 2 Zeile 6.

Und welche Signaturen hat dieses out.write

ist da wirklich ein ByteArray dabei?

flush() und close()?
 
Zuletzt bearbeitet von einem Moderator:

lumo

Top Contributor
das out ist ein
OutputStream out
und ist der out eines sockets.

was mich nun wundert (siehe edit oben) ist dass NICHT alle pngs nicht funktionieren, sondern nur 'ein paar'
werd noch etwas rumtesten um mehr rauszufinden

so, mir scheint, dass es bei files ab einer bestimmten größe passiert, nur warum, ist mir noch ein rätsel

achja, flush() löst das problem nicht.

---UPDATE---
ich konnte das problem zwar nicht wirklich erkennen, habs aber gelöst...
und zwar lese ich nun die files nicht mehr in ein byte[] ein sondern schreibe den inputstream direkt in den outputstream.
Java:
public static void send(OutputStream out, InputStream data) {
		int MAXBUFF = 1024;
		
		byte[] buffer = new byte[MAXBUFF];
		int len;
		try {
			while ((len = data.read(buffer)) != -1)
			{
			out.write(buffer,0,len);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
gleichzeitig löst sich damit das problem des sendens von großen dateien, wie weiter oben erwähnt auch auf...
wenn jemand meinen fehler trotzdem findet, und ihn mir erklären kann warum ich eine datei mit weniger als einem mb nicht in einem buffer halten darf bevor ich sie sende... würde mich interessieren
 
Zuletzt bearbeitet:

HoaX

Top Contributor
Ich bin mir ziemlich sicher dass InputStream#available() nicht die volle Länge zurückliefert wenn du es aus dem Jar startest. Dafür ist es auch nicht gedacht. Das mit der Schleife ist der korrekte weg.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben