Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

เมื่อไหร่ควรใช้ readAllBytes() ของ InputStream ใน Java 9

ตั้งแต่ Java 9 สามารถใช้เมธอด readAllBytes() จากคลาส InputStream อ่านทุกไบต์เข้า byte array เมธอดนี้อ่านไบต์ทั้งหมดจาก InputStream object ทีเดียว และ block จนกว่าจะอ่านไบต์ที่เหลือหมด ตก end of stream หรือมี exception โยนออกมา

เมธอด readAllBytes() ไม่ปิด InputStream instance เอง เมื่อถึง end of stream การเรียกซ้ำจะคืน empty byte array ใช้เมธอดนี้สำหรับกรณีง่ายๆ ที่สะดวกอ่านทั้งหมดเข้า byte array ไม่ได้ตั้งใจ สำหรับ input streams ที่มีข้อมูลมาก

ไวยากรณ์

public byte[] readAllBytes() throws IOException

ตัวอย่างการใช้งาน

สร้างไฟล์ "Technology.txt" ใน "C:\Temp\" ด้วยข้อมูล: { "JAVA", "PYTHON", "JAVASCRIPT", "SELENIUM", "SCALA" }

import java.nio.*;
import java.nio.file.*;
import java.io.*;
import java.util.stream.*;
import java.nio.charset.StandardCharsets;

public class ReadAllBytesMethodTest {
    public static void main(String args[]) {
        try (InputStream stream = Files.newInputStream(Paths.get("C://Temp//Technology.txt"))) {
            // Convert stream to string
            String contents = new String(stream.readAllBytes(), StandardCharsets.UTF_8);
            
            // Print the string content
            System.out.println(contents);
        } catch(IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

ผลลัพธ์

"JAVA", "PYTHON", "JAVASCRIPT", "SELENIUM", "SCALA"

readAllBytes() vs readNBytes() vs read()

เมธอดคืนค่าพฤติกรรมเหมาะสำหรับ
read()intอ่าน 1 ไบต์ -1=EOFLow-level byte-by-byte
read(byte[])int (bytes read)อ่านบางส่วน อาจไม่ครบ arrayBuffered reading
readNBytes(b,off,len)int (actual read)Block จนครบ len หรือ EOFFixed-size reads
readAllBytes()byte[]อ่านจน EOF คืนทั้งหมดไฟล์เล็ก ทั้งไฟล์

ข้อควรระวัง

  • Memory: อ่านไฟล์ใหญ่หมดเข้า heap → OutOfMemoryError
  • ไม่ปิด stream: ต้องใช้ try-with-resources หรือ close() เอง
  • Empty array: เรียกซ้ำหลัง EOF คืน byte[0]

ใช้ readAllBytes() กับไฟล์ config, properties, JSON/XML เล็กๆ ส่วนไฟล์ใหญ่ใช้ streaming หรือ readNBytes()