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

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

ตั้งแต่ Java 9 เมธอด readNBytes() ถูกเพิ่มในคลาส InputStream เมธอดนี้อ่านจำนวนไบต์ที่ร้องขอจาก input stream เข้าไปใน byte array ที่กำหนด เมธอดนี้ block จนกว่า len bytes จะอ่านครบ ตก end of stream หรือมี exception โยนออกมา readNBytes() ไม่ปิด input stream เมธอดนี้มีประโยชน์สำหรับหลีกเลี่ยง memory problems กับไฟล์ขนาดใหญ่

ไวยากรณ์

public int readNBytes(byte[] b, int off, int len) throws IOException

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

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

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

public class InputStreamReadNByteMethodTest {
    InputStream inputStream = InputStreamReadNByteMethodTest.class.getResourceAsStream("Technology.txt");
    
    public void testReadNBytes() throws Exception {
        final byte[] data = new byte[10];
        inputStream.readNBytes(data, 0, 7);
        System.out.println(new String(data));
    }
    
    public static void main(String args[]) throws Exception {
        InputStreamReadNByteMethodTest t = new InputStreamReadNByteMethodTest();
        t.testReadNBytes();
    }
}

ผลลัพธ์

"JAVA",

readNBytes() vs read() vs readAllBytes()

เมธอดพฤติกรรมเหมาะสำหรับ
read()อ่าน 1 ไบต์ คืน int (-1 = EOF)อ่านทีละไบต์ low-level
read(byte[])อ่านสูงสุด byte[].length ไบต์ คืนจำนวนที่อ่านจริงอ่าน chunk โดยไม่รู้ขนาดแน่นอน
readNBytes(byte[], off, len)อ่าน ครบ len ไบต์ (block จนครบหรือ EOF)ต้องการข้อมูลขนาดแน่นอน
readAllBytes()อ่านจน EOF คืน byte[] ทั้งหมดอ่านไฟล์เล็กทั้งหมด

จุดสำคัญ

  • readNBytes() รับประกันว่าอ่านครบ len bytes (เว้นแต่ EOF หรือ exception)
  • read(byte[]) อาจอ่านไม่ครบ array ต้องเช็ค return value
  • เหมาะสำหรับอ่าน fixed-size records หรือ protocols
  • ไม่ปิด stream เอง ต้องปิดด้วย try-with-resources