Byte [] to InputStream veya OutputStream


129

Veritabanı tablomda bir blob sütunum var, bunun için byte[]Java programımda bir eşleme olarak kullanmam ve bu verileri kullanmak için onu InputStreamveya 'ya dönüştürmem gerekiyor OutputStream. Ama bunu yaptığımda dahili olarak ne olduğunu bilmiyorum. Bu dönüşümü yaptığımda bana neler olduğunu kısaca açıklayan var mı?


2
Başlığın "bayt dizisi ..." veya "bayt dizisi ..." veya "bayt [] ..." olması "dizinin baytı ..." olması gerekmez mi?
kuester2000

Yanıtlar:


198

Bayt dizisi G / Ç akışlarını aşağıdaki gibi oluşturur ve kullanırsınız:

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

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

Standart JDBC Blob arabirimini uygulayan bir JDBC sürücüsü kullandığınızı varsayarsak (hepsi yapmaz), ayrıca ve yöntemlerini 1 kullanarak bir InputStreamveya OutputStreambir blob'a bağlayabilir ve ayrıca baytları doğrudan alabilir ve ayarlayabilirsiniz.getBinaryStreamsetBinaryStream

(Genel olarak, herhangi bir istisnayı ele almak ve akışları kapatmak için uygun adımları atmanız gerekir. Bununla birlikte, yukarıdaki örnekte, herhangi bir harici kaynakla (ör. Dosya tanımlayıcıları, soketler, veritabanı bağlantıları) ilişkili olmadıkları için kapatmak bisve bosgereksizdir.)

1 - setBinaryStreamYöntem gerçekten bir alıcıdır. Şekle gidin.


13

'Kullanım'ın okumak anlamına geldiğini varsayıyorum, ancak okuma vakası için açıklayacağım şey temelde yazma durumu için tersine çevrilebilir.

böylece bir bayt [] ile sonuçlanırsınız. bu, özel dönüştürme türlerine (karakter, şifrelenmiş vb.) ihtiyaç duyabilecek her türlü veriyi temsil edebilir. bu verileri olduğu gibi bir dosyaya yazmak istediğinizi varsayalım.

ilk olarak , temelde baytları sırayla bir şeye sağlamak için bir mekanizma olan bir ByteArrayInputStream oluşturabilirsiniz.

oluşturmak istediğiniz dosya için bir FileOutputStream oluşturabilirsiniz. farklı veri kaynakları ve hedefleri için birçok InputStreams ve OutputStreams türü vardır.

son olarak InputStream'i OutputStream'e yazarsınız. bu durumda, bayt dizisi yazma için FileOutputStream'e sırayla gönderilir. Bunun için IOUtils kullanmanızı öneririm

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

ve tersine

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

Yukarıdaki kod parçacıklarını kullanırsanız, istisnaları ele almanız gerekir ve 'kapatmaları' bir last blokta yapmanızı öneririm.


Bunu demek istemedin mi - ByteArrayOutputStream çıkışı = new ByteArrayOutputStream (); bunun yerine ByteArrayOutputStream out = new ByteArrayInputStream ();
Avihai Marchiano

CloseQuietly muhtemelen bir nihayet cümlesinde olmalıdır.
JustinKSU


4

InputStream / OutputStream ile birlikte çalıştıkları baytlar arasında dönüşüm yoktur. İkili veriler için yapılırlar ve baytları olduğu gibi tek tek okur (veya yazar).

Bayttan karaktere geçmek istediğinizde bir dönüşümün gerçekleşmesi gerekir. Sonra bir karakter seti kullanarak dönüştürmeniz gerekir. Bu, karakter verileri için yapılan baytlardan Dize veya Okuyucu yaptığınızda gerçekleşir.


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

0

Cevabımın bu soru için çok geç olduğunun farkındayım, ancak topluluğun bu konuya daha yeni bir yaklaşım isteyeceğini düşünüyorum .


Dairesel tamponlar, OP'nin sorununu çözmez. Soru'da yazıldığı gibi, OP tüm içeriğin tek bir bayt dizisinde olması gerekir.
Stephen C

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

Yanıt nesnesinde zaten var olan bir OutputStream'e sahip olduğunuz için bunun daha iyi olduğunu düşünüyorum. yeni bir OutputStream oluşturmaya gerek yok.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.