java.io প্যাকেজের ByteArrayInputStream ক্লাসটি একটি ইনপুট অ্যারে (বাইটের) পড়ার জন্য ব্যবহার করা যেতে পারে

একটি বাইট অ্যারে ইনপুট স্ট্রীম তৈরি করতে, আমাদের প্রথমে java.io.ByteArrayInputStream প্যাকেজ আমদানি করতে হবে। আমরা প্যাকেজ আমদানি করার পরে, একটি ইনপুট স্ট্রীম তৈরি করার জন্য আমাদের কাছে দুটি কনস্ট্রাক্টর উপলব্ধ রয়েছে:


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

ক্লাসের ভিতরে 4টি ক্ষেত্র রয়েছে:


// 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;
    

এবং এখানে আমাদের নির্মাতারা:


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;
}
    

ByteArrayInputStream ক্লাসের পদ্ধতি

পদ্ধতি কর্ম
int read() এই ইনপুট স্ট্রীম থেকে ডেটার পরবর্তী বাইট পড়ে।
int রিড (বাইট বি [], int বন্ধ, int লেন) ইনপুট স্ট্রীম থেকে বেশ কিছু বাইট পড়ে এবং সেগুলিকে বাফার অ্যারে b এ সঞ্চয় করে ।
অফ টার্গেট অ্যারে বি -তে একটি অফসেট ।
len হল পড়ার জন্য সর্বাধিক সংখ্যক বাইট।
লং স্কিপ (লং n) এই ইনপুট স্ট্রীম থেকে ইনপুট n বাইট এড়িয়ে যায়। এড়িয়ে যাওয়া বাইটের সংখ্যা ফেরত দেয় (যদি আমরা ইনপুট স্ট্রিমের শেষে পৌঁছাই তাহলে এটি n-এর থেকে কম হতে পারে)।
int উপলব্ধ() এই ইনপুট স্ট্রীম থেকে পড়া (বা এড়িয়ে যাওয়া) বাকি বাইটের সংখ্যা প্রদান করে।
অকার্যকর রিসেট() বাফারটিকে চিহ্নিত অবস্থানে পুনরায় সেট করে। চিহ্নিত অবস্থানটি 0 যদি না অন্য অবস্থান চিহ্নিত করা হয় বা কনস্ট্রাক্টরে একটি ভিন্ন অফসেট নির্দিষ্ট করা না থাকে।
বুলিয়ান মার্ক সমর্থিত() এই ইনপুটস্ট্রিম মার্কিং/রিসেটিং সমর্থন করে কিনা তা পরীক্ষা করে। ByteArrayInputStream এর জন্য সত্য ফেরত দেয়
অকার্যকর বন্ধ() কিছু করে না।
অকার্যকর চিহ্ন (int readAhead Limit) সেট করেচিহ্নবর্তমান অবস্থানের সমান ক্ষেত্র। যদি রিসেট পদ্ধতি বলা হয়, তাহলে সেই অবস্থান থেকে পরবর্তী পড়া শুরু হবে। readAheadLimit প্যারামিটার ব্যবহার করা হয় না এবং পদ্ধতির আচরণকে প্রভাবিত করে না

আসুন এই পদ্ধতিগুলি ঘনিষ্ঠভাবে দেখুন এবং দেখুন কিভাবে তারা অনুশীলনে কাজ করে।

পড়ুন()

আপনি যখন একটি সাধারণ ইনপুটস্ট্রিমের মতো করে একটি ByteArrayInputStream থেকে বাইট পড়তে চান , তখন আপনি 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();
   }
}
    

উপলব্ধ()

আপনি যদি আপনার বাফারে কিছু আছে কিনা তা পরীক্ষা করতে চান, আপনি উপলব্ধ() পদ্ধতিতে কল করতে পারেন।


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();
   }
}
    

আমরা দেখব যে বাফার থেকে প্রতিটি পড়ার পরে পড়ার জন্য উপলব্ধ বাইটের সংখ্যা পরিবর্তিত হয়।

আউটপুট:


পড়ার জন্য উপলব্ধ বাইট: পড়ার জন্য 4 বাইট উপলব্ধ:
পড়ার জন্য 3 বাইট উপলব্ধ: 2

এড়িয়ে যান (দীর্ঘ n)

আপনি একটি নির্দিষ্ট সংখ্যক বাইট এড়িয়ে যাওয়ার জন্য skip() পদ্ধতি ব্যবহার করতে পারেন এবং সেগুলি পড়তে পারেন না।


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();
   }
}
    

আউটপুট:

৩, ৪,

রিসেট()

এই পদ্ধতিটি বাফার করা স্ট্রীমের অবস্থানকে শেষ চিহ্নিত অবস্থানে পুনরায় সেট করে। এটি অবস্থান 0 যদি না একটি ভিন্ন চিহ্ন সেট করা হয়।


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();
   }
}
    

আমরা দেখব যে reset() মেথড কল করা আমাদের স্ট্রীমের শুরুর পয়েন্টে নিয়ে যায়।

আউটপুট:

রিড: 65
রিড: 66
রিড: 67
রিড: 68
কলিং রিসেট() মেথড
রিড: 65
রিড: 66

চিহ্ন (int readAhead Limit)

ByteArrayInputStream ক্লাসের mark () পদ্ধতিটি বর্তমান বাইট অবস্থানে অভ্যন্তরীণ চিহ্ন সেট করে, অর্থাৎ পূর্বে পড়া বাইটের পরপরই। এই পদ্ধতিটি একটি প্যারামিটার নেয় যা নির্দেশ করে যে স্ট্রিমটি অবৈধ হওয়ার আগে মার্কের পরে কতগুলি বাইট পড়া যাবে। ডিফল্টরূপে, যদি চিহ্নটি স্পষ্টভাবে সেট করা না থাকে, একটি ByteArrayInputStream অবস্থান 0 বা অফসেটের অবস্থানটি তার কন্সট্রাক্টরের কাছে চিহ্ন দেয়। এটা মনে রাখা গুরুত্বপূর্ণ যে readAheadLimit চিহ্ন এই শ্রেণীর জন্য অপ্রাসঙ্গিক।


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

এখানে একটি ByteArrayInputStream এর mark() এবং reset() পদ্ধতি ব্যবহার করে একটি চিহ্ন সেট করার একটি উদাহরণ রয়েছে । আমরা আগের উদাহরণে mark() পদ্ধতিতে একটি কল যোগ করব :


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();
   }
}
    

আমরা দেখতে পাচ্ছি যে বর্তমান প্রবাহের অবস্থান পরিবর্তিত হয়েছে।

আউটপুট:

রিড: 65
রিড: 66
রিড: 67
রিড: 68
রিড: 69
কলিং রিসেট() মেথড
রিড: 68
রিড: 69

মার্ক সমর্থিত()

markSupported () পদ্ধতি আপনাকে একটি চিহ্ন সেট করা যায় কিনা তা পরীক্ষা করতে দেয়। রিটার্ন মান কোথা থেকে আসে তা বোঝার জন্য, পদ্ধতির কোডে যাওয়া যাক:


/**
* 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;
}
    

পদ্ধতিটি সর্বদা সত্য ফিরে আসে । এর অনুশীলনে এটি পরীক্ষা করা যাক।


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();
   }
}
    

মার্ক() এবং রিসেট() পদ্ধতিগুলি চালানোর পরে , আমাদের স্ট্রীম সর্বদা প্রস্তুত এবং চিহ্নগুলিকে সমর্থন করে:

আউটপুট:

isMarkSupported: true
Read: 65
Read: 66
Read: 67
isMarkSupported: true
isMarkSupported: true

বন্ধ()

এবং বন্ধ পদ্ধতিটি বুঝতে , আসুন এটির ভিতরেও উঁকি দেওয়া যাক:


/**
* 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 {
}
    

বন্ধ পদ্ধতির জন্য ডকুমেন্টেশন আমাদের বলে যে একটি ByteArrayInputStream বন্ধ করার কোন প্রভাব নেই। ByteArrayInputStream ক্লাস পদ্ধতিগুলি স্ট্রীম বন্ধ হওয়ার পরে একটি IOException না ফেলে কল করা যেতে পারে ।

আমরা কি উপসংহার করতে পারি?

যখন আমরা একটি বাইট অ্যারে থেকে ডেটা পড়তে চাই তখন আমাদের একটি ByteArrayInputStream প্রয়োজন। সাধারণত এই ক্লাসটি অন্য কোডের সাথে একত্রিত করে ব্যবহার করা বোধগম্য হয় যা নিজে থেকে না হয়ে ইনপুটস্ট্রিমগুলির সাথে কীভাবে কাজ করতে হয় তা জানে।