2010-01-19 11 views
106

Ich habe eine Blob-Spalte in meiner Datenbanktabelle, für die ich byte[] in meinem Java-Programm als Mapping verwenden muss und um diese Daten zu verwenden, muss ich es in InputStream oder OutputStream konvertieren. Aber ich weiß nicht, was intern passiert, wenn ich das tue. Kann mir jemand kurz erklären, was passiert, wenn ich diese Konvertierung mache?Byte [] zu InputStream oder OutputStream

+2

hier überprüfen soll, nicht der Titel „Array von Bytes sein ... "oder" byte array ... "oder" byte [] ... "installed" byte of array ... "? – kuester2000

+1

Siehe das Gegenteil hier: http://StackOverflow.com/Questions/1264709/convert-inputstream-to-byte-in-java –

Antwort

167

Sie erstellen und verwenden Byte-Array-I/O-Streams wie folgt:

byte[] source = ...; 
ByteArrayInputStream bis = new ByteArrayInputStream(source); 
// read bytes from bis ... 

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
// write bytes to bos ... 
byte[] sink = bos.toByteArray(); 

Unter der Annahme, dass Sie einen JDBC-Treiber verwenden, der die Standard-JDBC Blob interface implementiert (nicht alle tun), können Sie auch eine Verbindung InputStream oder OutputStream zu einem Blob mit den getBinaryStream und setBinaryStream Methoden , und Sie können auch die Bytes direkt abrufen und festlegen.

(Im Allgemeinen sollten Sie geeignete Maßnahmen ergreifen, um alle Ausnahmen zu behandeln und Datenströme zu schließen. Das Schließen von bis und bos im obigen Beispiel ist jedoch unnötig, da sie keinen externen Ressourcen zugeordnet sind; z. B. Dateideskriptoren, Sockets, Datenbankverbindungen.)

1 - Die setBinaryStream Methode ist wirklich ein Getter. Stelle dir das vor.

+1

gut..sehr hilfreich –

4

Es gibt keine Konvertierung zwischen InputStream/OutputStream und den Bytes, mit denen sie arbeiten. Sie sind für binäre Daten gemacht und lesen die Bytes nur so wie sie sind.

Eine Konvertierung muss durchgeführt werden, wenn Sie von Byte zu Zeichen wechseln möchten. Dann müssen Sie mit einem Zeichensatz konvertieren. Dies passiert, wenn Sie String oder Reader aus Bytes machen, die für Zeichendaten gemacht werden.

+0

+1 - Ich würde diesen Teil der Frage beantworten, aber ich bin beschäftigt :-) –

12

Ich gehe davon aus, dass Sie meinen, dass 'verwenden' bedeutet lesen, aber was ich für den gelesenen Fall erkläre, kann für den Schreibfall grundsätzlich umgekehrt sein.

, so dass Sie mit einem Byte [] enden. Dies könnte jede Art von Daten darstellen, die spezielle Arten von Konvertierungen benötigen (Zeichen, verschlüsselt, usw.). Lassen Sie uns so tun, als wollten Sie diese Daten in eine Datei schreiben.

Erstens könnten Sie eine erstellen, die im Grunde ein Mechanismus ist, um die Bytes zu etwas in der Reihenfolge zu liefern.

dann können Sie eine FileOutputStream für die Datei erstellen, die Sie erstellen möchten. Es gibt viele Arten von InputStreams und OutputStreams für verschiedene Datenquellen und -ziele.

Schließlich würden Sie den InputStream in den OutputStream schreiben. In diesem Fall würde das Array von Bytes der Reihe nach zum Schreiben an den FileOutputStream gesendet werden. Dazu empfehle ich IOUtils

byte[] bytes = ...;// 
ByteArrayInputStream in = new ByteArrayInputStream(bytes); 
FileOutputStream out = new FileOutputStream(new File(...)); 
IOUtils.copy(in, out); 
IOUtils.closeQuietly(in); 
IOUtils.closeQuietly(out); 

und in umgekehrten

FileInputStream in = new FileInputStream(new File(...)); 
ByteArrayOutputStream out = new ByteArrayOutputStream(); 
IOUtils.copy(in, out); 
IOUtils.closeQuietly(in); 
IOUtils.closeQuietly(out); 
byte[] bytes = out.toByteArray(); 

wenn Sie den oben genannten Code-Schnipsel verwenden Sie Ausnahmen behandeln müssen und ich empfehle Sie die ‚schließen‘ in einem finally-Block .

+0

hast du nicht gemeint - ByteArrayOutputStream out = new ByteArrayOutputStream(); stattdessen ByteArrayOutputStream out = neues ByteArrayInputStream(); –

+0

ja oops ....... – pstanton

+0

CloseQuietly sollte wohl in einer finally-Klausel stehen. – JustinKSU

0

Ich weiß, dass meine Antwort ist viel zu spät für diese Frage, aber ich denke, die Gemeinde würde gerne a newer approach to this issue.

+0

Circular Buffer lösen das Problem des OP nicht. In der Frage, wie geschrieben, benötigt das OP den * gesamten * Inhalt in einem einzelnen Byte-Array. –

0
byte[] data = dbEntity.getBlobData(); 
response.getOutputStream().write(); 

Ich denke, das ist besser, da Sie bereits einen vorhandenen OutputStream im Antwortobjekt haben. keine Notwendigkeit, einen neuen OutputStream zu erstellen.

4

können wir byte [] Array in dem Eingangsstrom konvertieren, indem ByteArrayInputStream

String str = "Welcome to awesome Java World"; 
    byte[] content = str.getBytes(); 
    int size = content.length; 
    InputStream is = null; 
    byte[] b = new byte[size]; 
    is = new ByteArrayInputStream(content); 

Für vollständige Beispiel unter Verwendung von bitte http://www.onlinecodegeek.com/2015/09/how-to-convert-byte-into-inputstream.html

1
output = new ByteArrayOutputStream(); 
... 
input = new ByteArrayInputStream(output.toByteArray()) 
Verwandte Themen