Input/Output BufferedI/OStream leert den Speicher

Vector

Mitglied
Hallo alle beisammen.
In meinem derzeitigem Projekt habe ich ein Objekt welches eine Variable vom
Typ "java.io.InputStream" enthält.
Innerhalb dieses InputStreams ist der Inhalt einer Datei.

Mein Problem ist nun, wenn ich die Daten wegschreibe dann sind sie auch nicht mehr
im Speicher bzw. nicht mehr im Buffer vorhanden. Soll heißen wenn ich die Datei
wegschreibe ist meine Variable vom Typ "java.io.InputStream" leer.
Aber genau das darf bei mir nicht sein. Die Daten sollen trotz schreiben noch im Buffer
bleiben und erst dann verschwinden wenn ich das sozusagen sage ;)

Ist das irgendwie realisierbar?
Hier mal der Code den ich derzeit benutze:
Java:
try {
            // Open streams.
            input = new BufferedInputStream(image.getImage(), DEFAULT_BUFFER_SIZE);
            output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);
            
            // Write file contents to response.
            byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
            int length;
            while ((length = input.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }
        } finally {
            // Gently close streams.
            close(output);
            close(input);
        }
}
 

bERt0r

Top Contributor
Probier mal das hier aus:
Java:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;


public class BufferTest 
{
	public static void main(String[] args)
	{
		BufferedInputStream input=null;
		BufferedOutputStream output=null;
		try {
			// Open streams.

			FileWriter fw=new FileWriter("Nikolaus.txt");
			fw.write("Das ist das Haus vom Nikolaus\nUnd es ist ganz ganz schön.");
			fw.close();

			input = new BufferedInputStream(new FileInputStream(new File("Nikolaus.txt")), 256);
			output = new BufferedOutputStream(new FileOutputStream(new File("Klaus.txt")), 256);

			// Write file contents to response.
			byte[] buffer = new byte[256];
			int length;
			while ((length = input.read(buffer)) > 0) {
				output.write(buffer, 0, length);
			}

			System.out.println(new String(buffer));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			// Gently close streams.
			try {
				if(output!=null)
				{
					output.close();
				}
				if(input!=null)
				{
					input.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

Da dein Code ja nicht kompilierbar war, hab ich ein kskb für dich geschrieben. Wie du siehst steht im buffer sehr wohl noch was drin. Dein problem dürfte wohl sein, dass image.getImage() keinen Stream sondern ein Image zurückgibt. Wie dir das ganze durch den Compiler geht, weis ich aber nicht.
 
Zuletzt bearbeitet:

Vector

Mitglied
Da dein Code ja nicht kompilierbar war, hab ich ein kskb für dich geschrieben. Wie du siehst steht im buffer sehr wohl noch was drin. Dein problem dürfte wohl sein, dass image.getImage() keinen Stream sondern ein Image zurückgibt. Wie dir das ganze durch den Compiler geht, weis ich aber nicht.

Danke für deine Antwort. Ich habe mich vielleicht ein bisschen falsch ausgedrückt.
Es geht mir explizit nicht um das Array "Buffer" sondern eher um den Stream.
In meinem Beispiel siehst du dass der Stream von einem getter kommt:
Java:
input = new BufferedInputStream(image.getImage(), DEFAULT_BUFFER_SIZE);

Die method image.getImage() sieht so aus:
Java:
private InputStream image;
public InputStream getImage() {
        return image;
}

Ja du hast recht damit das innerhalb des Streams ein image ist.
Problem ist halt wie gesagt, sobald ich den Inputstream rausschreibe ist meine Objekt leer.
Und ich hab keine Ahnung wie ich es schaffe das sich dieses Objekt nicht leert?

Grüße
 

xerberuz

Bekanntes Mitglied
Wenn du etwas aus einem InputStream rausliest dann ist es da nicht mehr drin. Das ist bei Streams so. Da hilft dir auch kein BufferedStream weiter weil der nur Blöcke beim auslessen zwischenspeichert.

Wenn du das Bild im Speicher halten willst musst du es in ein Byte Array streamen und damit arbeiten.
 

bERt0r

Top Contributor
Ich glaube dir würde mein link im ersten Post sicher weiterhelfen, wenn du dir Zeit nimmst ihn durchzulesen. Ein Stream ist ein Datenstrom, der nur in einer Richtig geht. Ein Stream selber hat keinen Speicherbereich, der Buffer des Streams dient nur zur flüssigen Bearbeitung. Ein InputStream hat eine Quelle, die bleibt vom Inputstream auch unangetastet. Der Stream selber ist aber quasi nur ein Zeiger, der einmal über die Quelle läuft und die Daten an dich leitet.

Wenn du die Daten, die der Stream gelesen hat später noch brauchst, speicher sie gleich in eine Variable - kommt halt darauf an welche Daten du einliest. Ansonsten kannst du auch einfach den Stream neu erstellen.
 

Vector

Mitglied
Danke Euch beiden. Habe es jetzt verstanden und konnte somit auch mein Problem beheben ;)
Die Datei wurde bei mir über primefaces beim FileUpload hochgeladen.
Zu meiner Lösung jetzt habe ich einfach die Resource vom Event übergeben, in meinem Objekt abgespeichert.
Daher kann ich dann immer wieder den InputStream beziehen.

Danke nochmal. Erledigt!
 

Neue Themen


Oben