# BLOB in Datei speichern



## scooterJava (23. Dez 2008)

Ich möchte einen Blob in einem ResultSet auslesen und die Daten gleich in einer Datei speichern (Informix, JDBC, Java 5). Die Daten sind recht groß, deshalb möchte ich möglichst keine temporäre Datei oder Variable anlegen und den Arbeitsspeichern so wenig wie möglich belasten, sondern die Daten gleich bei Erhalt in einer Datei speichern.

Weiß jemand eine gute Lösung?

[EDIT]
Die Daten sind ein Zip-Archiv, keine Bilder oder sowas.


----------



## Gelöschtes Mitglied 5909 (23. Dez 2008)

was ist dein Problem? Das ist simples streamen und dabei wird auch der arbeitsspeicher nicht übermäßig strapaziert

http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Blob.html

ResultSet#getBlob

Blob#getBinaryStream


----------



## scooterJava (14. Jan 2009)

Ich binfolgendermaßen vorgegangen:

```
try
{
	// JDBC
	InputStream is = dbresult.getBinaryStream( 9 /* exe files */);
	FileOutputStream fos = new FileOutputStream( new File( file ) );
	while( 0 <= ( bytesread = is.read( buffer ) ) )
	{
		fos.write( buffer, 0, bytesread );
	}
	fos.flush();
	is.close();
	fos.close();
}
```
Leider erhalte ich einen Fehler bei getBinaryStream (die Spalte stimmt).


----------



## Ebenius (14. Jan 2009)

Wie baust Du Deine Query im Java auf? Wie genau lautet der Fehler?

Ebenius


----------



## scooterJava (14. Jan 2009)

Habe meinen Code wie folgt geändert:

```
// ...
ResultSet result = executeDBQuery( statement, true );
try
{
	Blob blob = result.getBlob( "exefile" );
	InputStream is = nlob.getBinaryStream();
	FileOutputStream fos = new FileOutputStream( new File( "zieldatei.exe" );
	// ...
```

Das SQL-Statement "statement" liefert ein korrektes Ergebnis, wie ich überprüft habe. Meine eigene Methode executeDBQuery() liefert deshalb ein ResultSet mit einer Ergebniszeile. Aus dieser Zeile soll aus der Spalte "exefile" das BLOB eingelesen werden - hier hapert es. Obwohl im Statement die Spalte benannt wurde ("SELECT ... exefile AS exefile ..."), wird mir hier eine SQLException geworfen. Warum?


----------



## Ebenius (14. Jan 2009)

scooterjava hat gesagt.:
			
		

> eine SQLException



*Message, Stacktrace, ...*?


----------



## scooterJava (14. Jan 2009)

Upps, vor dem getBlob() fehlt noch was:

```
// ...
ResultSet result = executeDBQuery( statement, true );
try
{
   result.next(); // Geht jetzt aufs erste Element (sonst steht der Cursor ja VOR dem ersten)
   Blob blob = result.getBlob( "exefile" );
   InputStream is = nlob.getBinaryStream();
   FileOutputStream fos = new FileOutputStream( new File( "zieldatei.exe" );
   // ...
```

Meine Fehlermeldungen der Exception:
Type is : {0}-4
Data Type Mismatch
[Ljava.lang.StackTraceElement;@1b06041


----------



## Ebenius (14. Jan 2009)

Oh Überraschung, Dein StackTrace besteht aus einem Array aus StackTraceElements... Jetzt bin ich aber platt... :-D

Kannste nicht einfach mal die ganze Exception mit 
	
	
	
	





```
ex.printStackTrace()
```
 ausgeben und dann posten?


----------



## scooterJava (19. Jan 2009)

Problem gelöst.

Was ich bisher nicht wusste: Der BLOB in der fremden Datenbank war kein BLOB, sondern es waren einfach nur Binärdaten (hätten mir die Kollegen auch eher sagen können). Einlesen mit getBytes() genügte ...


----------

