کلاس ByteArrayInputStream

کلاس ByteArrayInputStream به ما اجازه می دهد تا با یک آرایه از بایت ها که در RAM قرار دارد به عنوان یک جریان ورودی عمل کنیم و بتوانیم از کلاس هایی که زیر کلاس InputStream هستند در کنار آن بهره ببریم.این کلاس بیشتر به عنوان یک واسط در کنار کلاس های دیگر استفاده می شود.کاربرد اصلی این کلاس در شبکه است ، بدین صورت که اطلاعات به صورت آرایه ای از بایت ها از طریق شبکه دریافت می شوند و سپس با استفاده از ByteArrayInputStream به یک جریان ورودی تبدیل می شوند. برای استفاده از این کلاس باید از یکی از سازنده های زیر برای ساخت شی جدید از آن استفاده کنیم :

ByteArrayInputStream (byte[] b)
ByteArrayInputStream (byte[] b,int offset,int length)

متد های پر کاربرد ByteArrayInputStream در جدول زیر آمده است:

متد کاربرد
close () جریان ورودی را بسته و منابع استفاده شده را آزاد می کند
read() یک بایت از جریان ورودی خوانده و آن را به صورت یک int بر می گرداند ، در صورتی که به انتهای جریان ورودی رسیده باشیم خروجی این متد مقدار -1 خواهد بود.
read(byte[] b,int offset,int length) بایت ها را از جریان ورودی خوانده و در آرایه b ذخیره می کند و تعداد بایت های خوانده شده را بر می گرداند ، در صورتی که بایتی برای خواندن وجود نداشته باشد خروجی این متد مقدار -1 خواهد بود.

  • b:آرایه ای است که بایت ها در آن بافر می شوند
  • offset : اندیس شروع نوشتن در آرایه مورد نظر
  • length : حداکثر بایت هایی که باید خوانده شوند
available() تعداد بایت هایی که باقی ماند اند را مشخص می کند.

خواندن از یک آرایه

در مثال زیر با استفاده از متد read محتوی یک آرایه را بایت به بایت خوانده و چاپ می کنیم.

import java.io.*;

public class ByteArrayInputStreamDemo
{
    public ByteArrayInputStreamDemo()
    {
        byte[] buffer = { 72, 101, 108, 108, 111 };

        ByteArrayInputStream byteinputarraystream;

        try
        {
            byteinputarraystream = new ByteArrayInputStream(buffer);

            int v;
            while ((v = byteinputarraystream.read()) != -1)
            {
                System.out.print((char)v);
            }

            byteinputarraystream.close();

        }
        catch (IOException e) { }
    }
    public static void main(String[] args)
    {
        new ByteArrayInputStreamDemo();
    }
}

در مثال فوق آرایه مورد نظر از قبل آماده است در کاربرد های پیشرفته ممکن است این آرایه در زمان اجرا تولید شود (مثلاً در کاربرد های شبکه) ، بعد از ساخت ByteArrayInputStream می توانیم با آن به صورت یک InputStream معمولی بر خورد کنیم ، در داخل حلقه while هر بار یک بایت از استریم ورودی میخوانیم در صورتی که مقدار خوانده شده (v) برابر با -1 نباشد آن را به کاراکتر تبدیل و سپس چاپ می کنیم.خروجی کد بالا عبارت “Hello” خواهد بود.

تبدیل رشته به آرایه

در بسیاری از موارد قبل از استفاده از ByteArrayInputStream نیاز پیدا می کنیم تا یک رشته متنی را به آرایه ای از بایت ها تبدیل کنیم که در این صورت می توانیم از متد getBytes استفاده کنیم :

String s = "Hello Java";
byte[] arr = s.getBytes();