Byte [] su InputStream o OutputStream


129

Ho una colonna BLOB nella mia tabella del database, per la quale devo usare byte[]nel mio programma Java come mappatura e per usare questi dati devo convertirli in InputStreamo OutputStream. Ma non so cosa succede internamente quando lo faccio. Qualcuno può spiegarmi brevemente cosa succede quando eseguo questa conversione?


2
Il titolo non dovrebbe essere "array di byte ..." o "byte array ..." o "byte [] ..." instaurato di "byte di array ..."?
kuester2000,

Risposte:


198

È possibile creare e utilizzare flussi di I / O di array di byte come segue:

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

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

Supponendo che si stia utilizzando un driver JDBC che implementa l' interfaccia BLOB JDBC standard (non tutti lo fanno), è anche possibile connettere un InputStreamo OutputStreama un BLOB utilizzando i metodi getBinaryStreame 1 e inoltre è possibile ottenere e impostare direttamente i byte.setBinaryStream

(In generale, è necessario adottare le misure appropriate per gestire eventuali eccezioni e chiudere i flussi. Tuttavia, la chiusura bise bosnell'esempio sopra non è necessaria, poiché non sono associati a risorse esterne; ad esempio descrittori di file, socket, connessioni al database.)

1 - Il setBinaryStreammetodo è davvero un getter. Vai a capire.


13

Suppongo che intendi dire che "uso" significa lettura, ma ciò che spiegherò per il caso di lettura può essere sostanzialmente invertito per il caso di scrittura.

così finisci con un byte []. questo potrebbe rappresentare qualsiasi tipo di dato che potrebbe richiedere tipi speciali di conversioni (carattere, criptato, ecc.). facciamo finta di voler scrivere questi dati come in un file.

in primo luogo è possibile creare un ByteArrayInputStream che è fondamentalmente un meccanismo per fornire i byte a qualcosa in sequenza.

quindi è possibile creare un FileOutputStream per il file che si desidera creare. ci sono molti tipi di InputStreams e OutputStreams per diverse origini dati e destinazioni.

infine, dovresti scrivere InputStream su OutputStream. in questo caso, l'array di byte verrebbe inviato in sequenza a FileOutputStream per la scrittura. Per questo consiglio di usare IOUtils

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

e al contrario

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

se usi gli snippet di codice sopra indicati dovrai gestire le eccezioni e ti consiglio di fare le 'chiusure' in un blocco finally.


non volevi dire - ByteArrayOutputStream out = new ByteArrayOutputStream (); invece ByteArrayOutputStream out = new ByteArrayInputStream ();
Avihai Marchiano,

Chiudi Probabilmente dovrebbe essere probabilmente in una clausola finally.
JustinKSU,


4

Non c'è conversione tra InputStream / OutputStream e i byte con cui stanno lavorando. Sono fatti per dati binari e leggono (o scrivono) i byte uno per uno così com'è.

Una conversione deve avvenire quando si desidera passare da byte a char. Quindi è necessario convertire utilizzando un set di caratteri. Questo succede quando si creano String o Reader da byte, che sono fatti per i dati dei caratteri.


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


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

Penso che sia meglio poiché hai già un OutputStream esistente nell'oggetto risposta. non è necessario creare un nuovo OutputStream.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.