FileOutputStream erzeugt datei

neela

Bekanntes Mitglied
hallo
beim durchstöbern meines eclipseverzeichnisses ist mir aufgefallen das jedes mal wenn ich folgende Funktion aufrufe die entsprechende Datei im Eclipseverzeichniss angelegt wird
Wo liegt mein Fehler / bzw was muss ich anders machen damit dieser "Speichermüll" nicht entsteht.


Java:
public static File template(String parameter) {
		Connection dbconn = verbinden();
		String abfrage = "Select Datei from BR_Parameter Where Name='"
				+ parameter + "'";
		Statement stm;

		ResultSet rs;
		File jrxml = null;
		try {
			stm = dbconn.createStatement();
			rs = stm.executeQuery(abfrage);
			//Datei aus Datenbank lesen
			InputStream is = null;
			FileOutputStream fos = null;
			byte[] buff = new byte[8192];
			while (rs.next()) {
				
				jrxml = new File(parameter);
				is = rs.getBinaryStream(1);
				fos = new FileOutputStream(jrxml);
				
				int len;
				while (0 < (len = is.read(buff))) {
					fos.write(buff, 0, len);
				}
			}
			fos.flush();
			fos.close();
			is.close();
			rs.close();
			stm.close();
			dbconn.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block  
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return jrxml;
	}

Vielen Dank für euren Rat
 
Zuletzt bearbeitet:
Du benutzt einen FileOutputStream und wunderst dich, dass eine Datei angelegt wird oO? Was hast du den erwartet, was passiert?
 
am effektivsten wäre, die Methode gar nicht aufzurufen,
oder falls dessen entscheidene Funktionialität das Auslesen des Datenbank-InputStreams ist, dann geht auch eine Schleife
die die eingelesenen Daten gar nicht verwendet
[c]while (0 < is.read(buff));[/c]

aber wozu dann das Ganze?!
 
ich habe ein servlet geschrieben welches eine PDF erstellt.
Und für diese Erstellung muss ich Elemente (wie Bilder, oder die Templates) aus der Datenbank herauslesen.
Aus diesen Grund kann ich auch keine "Zwischendateien" erzeugen da der Server ja net unnütz zugemüllt werden soll.
 
FileOutputStream erstellt, wie es der Name vermuten lässt, eine Datei und schreibt die Daten da rein.
Für soetwas finde ich den ByteArrayOutputStream ganz angenehm. Du arbeitest mit ihm, wie mit jedem OutputStream und lässt dir zum Schluss das ByteArray ausgeben.
 
Problem nun folgendermaßen gelöst

Java:
public static byte[] template(String parameter) {
		Connection dbconn = verbinden();
		String abfrage = "Select Datei from BR_Parameter Where Name='"
				+ parameter + "'";
		Statement stm;
		byte[] buff = new byte[8192];
		ResultSet rs;
		InputStream is = null;
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		DataOutputStream out = new DataOutputStream(baos);
		byte[] datei = null;
		try {
			stm = dbconn.createStatement();
			rs = stm.executeQuery(abfrage);
			while (rs.next()) {
				// Datei aus Datenbank lesen
				is = rs.getBinaryStream(1);

				int len;
				while (0 < (len = is.read(buff))) {
					out.write(buff, 0, len);

				}
			}
			out.close();
			buff = null;

			datei = baos.toByteArray();
			is.close();
			rs.close();
			stm.close();
			dbconn.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return datei;
	}

auffolgende Art und Weise nutze ich dann die Methode
Java:
	ByteArrayInputStream input = new ByteArrayInputStream(Datenbank
						.template("wappen_bunt"));
				wappen = ImageIO.read(input);

bzw.
Java:
input = new ByteArrayInputStream(Datenbank.template("anhang1"));

			jasperReport = JasperCompileManager.compileReport(input);
 

Zurück
Oben