Byte [] zu InputStream oder OutputStream


129

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


2
Sollte der Titel nicht "Array von Bytes ..." oder "Byte-Array ..." oder "Byte [] ..." sein, anstelle von "Byte des Arrays ..."?
kuester2000

Antworten:


198

Sie erstellen und verwenden Byte-Array-E / A-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();

Angenommen, Sie verwenden einen JDBC-Treiber, der die Standard- JDBC-Blob-Schnittstelle implementiert (nicht alle), können Sie auch einen InputStreamoder OutputStreameinen Blob mit den Methoden getBinaryStreamund 1 verbinden und die Bytes direkt abrufen und festlegen.setBinaryStream

(Im Allgemeinen sollten Sie geeignete Schritte unternehmen, um Ausnahmen zu behandeln und Streams zu schließen. Das Schließen bisund bosim obigen Beispiel ist jedoch nicht erforderlich, da sie keinen externen Ressourcen zugeordnet sind, z. B. Dateideskriptoren, Sockets, Datenbankverbindungen.)

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


13

Ich gehe davon aus, dass Sie meinen, dass "Verwenden" Lesen bedeutet, aber was ich für den Lesefall erkläre, kann für den Schreibfall grundsätzlich umgekehrt werden.

Sie erhalten also ein Byte []. Dies kann jede Art von Daten darstellen, für die spezielle Arten von Konvertierungen erforderlich sind (Zeichen, verschlüsselt usw.). Stellen wir uns vor, Sie möchten diese Daten so wie sie sind in eine Datei schreiben.

Erstens könnten Sie einen ByteArrayInputStream erstellen, der im Grunde ein Mechanismus ist, um die Bytes nacheinander an etwas zu liefern.

Dann können Sie einen 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.

Zuletzt würden Sie den InputStream in den OutputStream schreiben. In diesem Fall wird das Array von Bytes nacheinander zum Schreiben an den FileOutputStream gesendet. Dafür empfehle ich die Verwendung von 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 umgekehrt

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 die obigen Code-Schnipsel verwenden, müssen Sie Ausnahmen behandeln, und ich empfehle Ihnen, die "Closes" in einem finally-Block durchzuführen.


meinten Sie nicht - ByteArrayOutputStream out = new ByteArrayOutputStream (); stattdessen ByteArrayOutputStream out = new ByteArrayInputStream ();
Avihai Marchiano

CloseQuietly sollte wahrscheinlich in einer finally-Klausel enthalten sein.
JustinKSU


4

Es gibt keine Konvertierung zwischen InputStream / OutputStream und den Bytes, mit denen sie arbeiten. Sie sind für Binärdaten gemacht und lesen (oder schreiben) die Bytes einfach so wie sie sind.

Eine Konvertierung muss erfolgen, wenn Sie von Byte zu Zeichen wechseln möchten. Dann müssen Sie mit einem Zeichensatz konvertieren. Dies geschieht, wenn Sie String oder Reader aus Bytes erstellen, die für Zeichendaten erstellt wurden.


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

0

Mir ist klar, dass meine Antwort auf diese Frage viel zu spät ist, aber ich denke, die Community möchte einen neueren Ansatz für dieses Problem .


Kreisförmige Puffer lösen das OP-Problem nicht. In der geschriebenen Frage benötigt das OP den gesamten Inhalt in einem einzelnen Byte-Array.
Stephen C

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

Ich denke, das ist besser, da Sie bereits einen OutputStream im Antwortobjekt haben. Sie müssen keinen neuen OutputStream erstellen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.