Byte [] thành InputStream hoặc OutputStream


129

Tôi có một cột blob trong bảng cơ sở dữ liệu của mình, mà tôi phải sử dụng byte[]trong chương trình Java của mình làm ánh xạ và để sử dụng dữ liệu này, tôi phải chuyển đổi nó thành InputStreamhoặc OutputStream. Nhưng tôi không biết những gì xảy ra trong nội bộ khi tôi làm như vậy. Bất cứ ai có thể giải thích ngắn gọn cho tôi những gì xảy ra khi tôi thực hiện chuyển đổi này?


2
Không phải tiêu đề là "mảng byte ..." hay "mảng byte ..." hay "byte [] ..." được đặt theo "byte của mảng ..."?
kuester2000

1
Xem ngược lại tại đây: stackoverflow.com/questions/1264709/ Mạnh
Jay Taylor

Câu trả lời:


198

Bạn tạo và sử dụng các luồng I / O mảng byte như sau:

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

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

Giả sử rằng bạn đang sử dụng trình điều khiển JDBC thực hiện giao diện JDBC Blob tiêu chuẩn (không phải tất cả), bạn cũng có thể kết nối một InputStreamhoặc OutputStreamvới một blob bằng cách sử dụng getBinaryStreamsetBinaryStreamphương thức 1 , và bạn cũng có thể nhận và đặt byte trực tiếp.

(Nói chung, bạn nên thực hiện các bước thích hợp để xử lý bất kỳ trường hợp ngoại lệ nào và đóng luồng. Tuy nhiên, việc đóng bisbostrong ví dụ trên là không cần thiết, vì chúng không liên quan đến bất kỳ tài nguyên bên ngoài nào, ví dụ: mô tả tệp, ổ cắm, kết nối cơ sở dữ liệu.)

1 - setBinaryStreamPhương pháp này thực sự là một getter. Đi hình.


13

Tôi giả sử bạn có nghĩa là 'sử dụng' có nghĩa là đọc, nhưng những gì tôi sẽ giải thích cho trường hợp đọc về cơ bản có thể đảo ngược cho trường hợp ghi.

vì vậy bạn kết thúc với một byte []. điều này có thể đại diện cho bất kỳ loại dữ liệu nào có thể cần các loại chuyển đổi đặc biệt (ký tự, mã hóa, v.v.). hãy giả vờ rằng bạn muốn ghi dữ liệu này vào một tệp.

trước tiên, bạn có thể tạo ByteArrayInputStream , về cơ bản là một cơ chế để cung cấp các byte cho một thứ gì đó theo thứ tự.

sau đó bạn có thể tạo FileOutputStream cho tệp bạn muốn tạo. có nhiều loại InputStreams và OutputStreams cho các nguồn dữ liệu và đích khác nhau.

cuối cùng, bạn sẽ viết InputStream vào OutputStream. trong trường hợp này, mảng byte sẽ được gửi theo thứ tự đến FileOutputStream để ghi. Đối với điều này, tôi khuyên bạn nên sử dụng IOUtils

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

và ngược lại

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

nếu bạn sử dụng các đoạn mã trên, bạn sẽ cần xử lý các trường hợp ngoại lệ và tôi khuyên bạn nên thực hiện 'đóng' trong một khối cuối cùng.


ý bạn không phải là - ByteArrayOutputStream out = new ByteArrayOutputStream (); thay vì ByteArrayOutputStream out = new ByteArrayInputStream ();
Avihai Marchiano

CloseQuietly có lẽ nên ở một mệnh đề cuối cùng.
JustinKSU

5

chúng ta có thể chuyển mảng byte [] thành luồng đầu vào bằng cách sử dụng 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);

Để biết ví dụ đầy đủ, vui lòng kiểm tra tại đây http://www.onlinecodegeek.com/2015/09/how-to-convert-byte-into-inputstream.html


4

Không có chuyển đổi giữa InputStream / OutputStream và các byte họ đang làm việc. Chúng được tạo cho dữ liệu nhị phân và chỉ đọc (hoặc ghi) từng byte một.

Một chuyển đổi cần phải xảy ra khi bạn muốn chuyển từ byte sang char. Sau đó, bạn cần chuyển đổi bằng cách sử dụng một bộ ký tự. Điều này xảy ra khi bạn tạo String hoặc Reader từ byte, được tạo cho dữ liệu ký tự.


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


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

Tôi nghĩ rằng điều này tốt hơn vì bạn đã có một OutputStream hiện có trong đối tượng phản hồi. không cần phải tạo một OutputStream mới.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.