ไบต์ [] ถึง InputStream หรือ OutputStream


129

ฉันมีคอลัมน์หยดในตารางฐานข้อมูลของฉันซึ่งฉันต้องใช้byte[]ในโปรแกรม Java ของฉันเป็นการทำแผนที่และการใช้ข้อมูลนี้ฉันต้องแปลงเป็นหรือInputStream OutputStreamแต่ฉันไม่รู้ว่าเกิดอะไรขึ้นภายในเมื่อฉันทำเช่นนั้น ทุกคนสามารถอธิบายสั้น ๆ ว่าเกิดอะไรขึ้นเมื่อฉันทำ Conversion นี้


2
ชื่อไม่ควรเป็น "อาร์เรย์ของไบต์ ... " หรือ "ไบต์อาร์เรย์ ... " หรือ "ไบต์ [] ... " ติดตั้ง "ไบต์ของอาร์เรย์ ... " หรือไม่
kuester2000

1
ดูสิ่งที่ตรงกันข้ามได้ที่นี่: stackoverflow.com/questions/1264709/…
Jay Taylor

คำตอบ:


198

คุณสร้างและใช้สตรีมอาร์เรย์ I / O ของอาร์เรย์ดังนี้:

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

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

สมมติว่าคุณกำลังใช้ไดรเวอร์ JDBC ที่ใช้อินเตอร์เฟส JDBC Blobมาตรฐาน(ไม่ใช่ทั้งหมด) คุณยังสามารถเชื่อมต่อ a InputStreamหรือOutputStreamไปยัง blob โดยใช้getBinaryStreamและsetBinaryStreamวิธีที่1และคุณยังสามารถรับและตั้งค่าไบต์โดยตรง

(โดยทั่วไปคุณควรทำตามขั้นตอนที่เหมาะสมเพื่อจัดการกับข้อยกเว้นและปิดสตรีมอย่างไรก็ตามการปิดbisและbosในตัวอย่างข้างต้นไม่จำเป็นเนื่องจากไม่เกี่ยวข้องกับแหล่งข้อมูลภายนอกใด ๆ เช่นตัวอธิบายไฟล์ซ็อกเก็ตการเชื่อมต่อฐานข้อมูล)

1 - setBinaryStreamวิธีการเป็นผู้ทะเยอทะยานจริงๆ ไปคิด


13

ฉันสมมติว่าคุณหมายถึงว่า 'การใช้งาน' หมายถึงการอ่าน แต่สิ่งที่ฉันจะอธิบายสำหรับกรณีการอ่านสามารถย้อนกลับโดยทั่วไปสำหรับกรณีการเขียน

ดังนั้นคุณต้องจบด้วยไบต์ [] สิ่งนี้สามารถแสดงข้อมูลประเภทใดก็ได้ที่อาจต้องการการแปลงประเภทพิเศษ (ตัวละครเข้ารหัส ฯลฯ ) สมมติว่าคุณต้องการเขียนข้อมูลนี้เหมือนไฟล์

ประการแรกคุณสามารถสร้างByteArrayInputStreamซึ่งเป็นกลไกในการส่งไบต์ไปยังบางสิ่งตามลำดับ

จากนั้นคุณสามารถสร้างFileOutputStreamสำหรับไฟล์ที่คุณต้องการสร้าง มี InputStreams และ OutputStreams หลายประเภทสำหรับแหล่งข้อมูลและปลายทางที่แตกต่างกัน

สุดท้ายคุณก็จะเขียน InputStream ไปที่ OutputStream ในกรณีนี้อาร์เรย์ของไบต์จะถูกส่งตามลำดับไปยัง FileOutputStream สำหรับการเขียน สำหรับสิ่งนี้ฉันขอแนะนำให้ใช้IOUtils

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

และในทางกลับกัน

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

หากคุณใช้ตัวอย่างโค้ดข้างต้นคุณจะต้องจัดการกับข้อยกเว้นและฉันขอแนะนำให้คุณ 'ปิด' ในบล็อกในที่สุด


คุณไม่ได้หมายถึง - ByteArrayOutputStream out = ใหม่ ByteArrayOutputStream (); แทน ByteArrayOutputStream out = new ByteArrayInputStream ();
Avihai Marchiano

ปิดอย่างเงียบ ๆ น่าจะเป็นประโยคสุดท้าย
JustinKSU

5

เราสามารถแปลงไบต์ [] อาร์เรย์เป็นสตรีมอินพุตโดยใช้ 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);

สำหรับตัวอย่างเต็มโปรดตรวจสอบที่นี่http://www.onlinecodegeek.com/2015/09/how-to-convert-byte-into-inputstream.html


4

ไม่มีการแปลงระหว่าง InputStream / OutputStream และไบต์ที่ทำงานด้วย พวกเขาถูกสร้างขึ้นสำหรับข้อมูลไบนารีและเพียงแค่อ่าน (หรือเขียน) ไบต์หนึ่งต่อหนึ่งตามที่เป็นอยู่

การแปลงต้องเกิดขึ้นเมื่อคุณต้องการจากไบต์เป็นอักขระ จากนั้นคุณต้องแปลงโดยใช้ชุดอักขระ สิ่งนี้จะเกิดขึ้นเมื่อคุณสร้างสตริงหรือตัวอ่านจากไบต์ซึ่งสร้างขึ้นสำหรับข้อมูลตัวอักษร



0

ฉันรู้ว่าคำตอบของฉันสายไปสำหรับคำถามนี้ แต่ฉันคิดว่าชุมชนต้องการแนวทางใหม่ในการแก้ไขปัญหานี้


บัฟเฟอร์แบบวงกลมไม่สามารถแก้ไขปัญหาของ OP ในคำถามตามที่เขียนไว้ OP ต้องการเนื้อหาทั้งหมดในอาร์เรย์ไบต์เดียว
Stephen C

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

ฉันคิดว่าสิ่งนี้ดีกว่าเนื่องจากคุณมี OutputStream อยู่แล้วในวัตถุตอบกลับ ไม่จำเป็นต้องสร้าง OutputStream ใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.