Kelas ByteArrayInputStream dalam paket java.io dapat digunakan untuk membaca input array (byte).

Untuk membuat aliran input array byte, pertama-tama kita harus mengimpor paket java.io.ByteArrayInputStream . Setelah kami mengimpor paket, kami memiliki dua konstruktor yang tersedia untuk membuat aliran masukan:


ByteArrayInputStream input = new ByteArrayInputStream(arr);
ByteArrayInputStream input = new ByteArrayInputStream(arr, 2, 2);
    

Ada 4 bidang di dalam kelas:


// Byte array provided by the creator of the stream
protected byte buf[];

// Index of the next character to read from the input stream's buffer
protected int pos;

// Current marked position in the stream
protected int mark = 0;

// Index is one greater than the last valid character in the input stream's buffer
protected int count;
    

Dan inilah konstruktor kami:


public ByteArrayInputStream(byte buf[]) {
    this.buf = buf;
    this.pos = 0;
    this.count = buf.length;
}

public ByteArrayInputStream(byte buf[], int offset, int length) {
    this.buf = buf;
    this.pos = offset;
    this.count = Math.min(offset + length, buf.length);
    this.mark = offset;
}
    

Metode kelas ByteArrayInputStream

metode Tindakan
int baca() Membaca byte data berikutnya dari input stream ini.
int baca(byte b[], int mati, int len) Membaca beberapa byte dari input stream dan menyimpannya dalam buffer array b .
off adalah offset ke array target b .
len adalah jumlah maksimum byte untuk dibaca.
lompat jauh (panjang n) Melewati n byte input dari aliran input ini. Mengembalikan jumlah byte yang dilewati (mungkin kurang dari n jika kita mencapai akhir aliran input).
int tersedia() Mengembalikan jumlah byte tersisa yang dapat dibaca (atau dilewati) dari input stream ini.
membatalkan reset() Mereset buffer ke posisi yang ditandai. Posisi yang ditandai adalah 0 kecuali posisi lain ditandai atau offset yang berbeda ditentukan dalam konstruktor.
tanda booleanDidukung() Memeriksa apakah InputStream ini mendukung penandaan/pengaturan ulang. Mengembalikan true untuk ByteArrayInputStream .
batal tutup() Tidak melakukan apa-apa.
tanda batal (int readAheadLimit) Mengaturtandalapangan sama dengan posisi saat ini. Jika metode reset dipanggil, maka pembacaan selanjutnya akan dimulai dari posisi tersebut. Parameter readAheadLimit tidak digunakan dan tidak memengaruhi perilaku metode.

Mari kita lihat lebih dekat metode ini dan lihat cara kerjanya dalam praktik.

membaca()

Saat Anda ingin membaca byte dari ByteArrayInputStream seperti yang Anda lakukan dari InputStream biasa , Anda dapat menggunakan metode read() .


public static void main(String[] args) {
   byte[] array = {1, 2, 3, 4};

   try (ByteArrayInputStream input = new ByteArrayInputStream(array)) {
       for (int i = 0; i < array.length; i++) {
           int data = input.read();
           System.out.print(data + ", ");
       }
   } catch (IOException e) {
       e.printStackTrace();
   }
}
    

tersedia()

Jika Anda ingin memeriksa apakah ada sesuatu di buffer Anda, Anda dapat memanggil metode available() .


public static void main(String[] args) {
   byte[] array = {1, 2, 3, 4};

   try (ByteArrayInputStream input = new ByteArrayInputStream(array)) {
       System.out.println("Bytes available for reading: " + input.available());

       input.read();
       System.out.println("Bytes available for reading " + input.available());

       input.read();
       System.out.println("Bytes available for reading " + input.available());
   } catch (IOException e) {
       e.printStackTrace();
   }
}
    

Kita akan melihat bahwa jumlah byte yang tersedia untuk membaca berubah setelah setiap pembacaan dari buffer.

Keluaran:

Byte tersedia untuk dibaca: 4
Byte tersedia untuk dibaca: 3
Byte tersedia untuk dibaca: 2

lewati (panjang n)

Anda dapat menggunakan metode skip() untuk melewatkan sejumlah byte tertentu dan tidak membacanya.


public static void main(String[] args) {
   byte[] array = {1, 2, 3, 4};

   try (ByteArrayInputStream input = new ByteArrayInputStream(array)) {
       input.skip(2);

       while (input.available() != 0) {
           int data = input.read();
           System.out.print(data + ", ");
       }
   } catch (IOException e) {
       e.printStackTrace();
   }
}
    

Keluaran:

3, 4,

mengatur ulang()

Metode ini mengatur ulang posisi aliran buffer ke posisi terakhir yang ditandai. Itu adalah posisi 0 kecuali tanda yang berbeda ditetapkan.


public static void main(String[] args) {
   byte[] buf = {65, 66, 67, 68, 69};
   try (ByteArrayInputStream input = new ByteArrayInputStream(buf)) {
       System.out.println("Read: " + input.read());
       System.out.println("Read: " + input.read());
       System.out.println("Read: " + input.read());
       System.out.println("Read: " + input.read());

       System.out.println("Calling reset() method");
       input.reset();
       System.out.println("Read: " + input.read());
       System.out.println("Read: " + input.read());
   } catch (IOException e) {
       e.printStackTrace();
   }
}
    

Kita akan melihat bahwa memanggil metode reset() membawa kita ke titik awal aliran kita.

Keluaran:

Baca: 65
Baca: 66
Baca: 67
Baca: 68
Memanggil metode reset()
Baca: 65
Baca: 66

tandai(int readAheadLimit)

Metode mark() dari kelas ByteArrayInputStream menyetel tanda internal pada posisi byte saat ini, yaitu segera setelah byte yang dibaca sebelumnya. Metode ini mengambil parameter yang menunjukkan berapa banyak byte yang dapat dibaca setelah tanda sebelum aliran menjadi tidak valid. Secara default, jika tanda tidak disetel secara eksplisit, ByteArrayInputStream menandai posisi 0 atau posisi offset diteruskan ke konstruktornya. Penting untuk diperhatikan bahwa tanda readAheadLimit tidak relevan untuk kelas ini.


/* Note: For this class, {@code readAheadLimit}
*  has no meaning.
*
* @since   1.1
*/
public void mark(int readAheadLimit) {
   mark = pos;
}
    

Berikut adalah contoh menyetel tanda di ByteArrayInputStream menggunakan metode mark() dan reset() . Kami akan menambahkan panggilan ke metode mark() ke contoh sebelumnya:


public static void main(String[] args) {
   byte[] buf = {65, 66, 67, 68, 69};
   try (ByteArrayInputStream input = new ByteArrayInputStream(buf)) {
       System.out.println("Read: " + input.read());
       System.out.println("Read: " + input.read());
       System.out.println("Read: " + input.read());
       input.mark(5);

       System.out.println("Read: " + input.read());
       System.out.println("Read: " + input.read());

       System.out.println("Calling reset() method");
       input.reset();

       System.out.println("Read: " + input.read());
       System.out.println("Read: " + input.read());

   } catch (IOException e) {
       e.printStackTrace();
   }
}
    

Kita dapat melihat bahwa posisi aliran saat ini telah berubah.

Keluaran:

Baca: 65
Baca: 66
Baca: 67
Baca: 68
Baca: 69
Memanggil metode reset()
Baca: 68
Baca: 69

markSupported()

Metode markSupported() memungkinkan Anda memeriksa apakah tanda dapat disetel. Untuk memahami dari mana nilai pengembalian berasal, mari kita ke kode metode:


/**
* Tests if this {@code InputStream} supports mark/reset. The
* {@code markSupported} method of {@code ByteArrayInputStream}
* always returns {@code true}.
*
* @since   1.1
*/
public boolean markSupported() {
   return true;
}
    

Metode selalu mengembalikan true . Mari kita uji ini dalam praktik.


public static void main(String[] args) {
   byte[] buf = {65, 66, 67, 68, 69};
   try (ByteArrayInputStream bais = new ByteArrayInputStream(buf)) {
       boolean isMarkSupported = bais.markSupported();

       System.out.println("isMarkSupported: " + isMarkSupported);
       System.out.println("Read: " + bais.read());
       System.out.println("Read: " + bais.read());

       bais.mark(1);
       System.out.println("Read: " + bais.read());
       isMarkSupported = bais.markSupported();
       System.out.println("isMarkSupported: " + isMarkSupported);

       bais.reset();
       isMarkSupported = bais.markSupported();
       System.out.println("isMarkSupported: " + isMarkSupported);
   } catch (IOException e) {
       e.printStackTrace();
   }
}
    

Setelah menjalankan metode mark() dan reset() , aliran kami selalu siap dan mendukung tanda:

Keluaran:

isMarkSupported: true
Baca: 65
Baca: 66
Baca: 67
isMarkSupported: true
isMarkSupported: true

menutup()

Dan untuk memahami metode tutup , mari kita intip juga di dalamnya:


/**
* Closing a {@code ByteArrayInputStream} has no effect. The methods in
* this class can be called after the stream has been closed without
* generating an {@code IOException}.
*/
public void close() throws IOException {
}
    

Dokumentasi untuk metode close memberi tahu kita bahwa menutup ByteArrayInputStream tidak berpengaruh. Metode kelas ByteArrayInputStream dapat dipanggil setelah aliran ditutup tanpa membuang IOException .

Apa yang bisa kita simpulkan?

Kami membutuhkan ByteArrayInputStream saat kami ingin membaca data dari array byte. Biasanya masuk akal untuk menggunakan kelas ini dalam kombinasi dengan kode lain yang mengetahui cara bekerja dengan InputStreams daripada dengan sendirinya.