کلاس BufferedReader

همانطور که می دانیم کلاس های Reader برای خواندن از جریان کاراکتری به کار می روند، از آنجایی که خواندن کاراکتر به کاراکتر چندان بهینه نیست باید از تکنیک بافر کردن برای بهینه سازی و افزایش سرعت عمل خواندن استفاده کنیم، کلاس BufferedReader با استفاده از تکنیک بافر کردن عمل خواندن را بهبود می بخشد. از این کلاس می توان برای خواندن از فایل، خواندن از وروردی سیستم (کنسول) و یا خواندن از یک حافظه بافر نیز استفاده کرد. برای استفاده از این کلاس باید از یکی از سازنده های زیر برای ساخت شی جدید از آن استفاده کنیم :

BufferedReader (Reader in)
BufferedReader (Reader in,int bufferSize)

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

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

  • cbuf :آرایه ای است که کاراکتر ها در آن بافر می شوند
  • offset : اندیس شروع نوشتن در آرایه مورد نظر
  • length : حداکثر کاراکتر هایی که باید خوانده شوند
String readLine() یک خط از جریان ورودی می خواند.
boolean ready () مشخص می کند که قادر به خواندن از جریان ورودی هستیم یا خیر ، خروجی این متد به صورت true یا false است.

خواندن از فایل با متد read

در مثال زیر با استفاده از متد read محتوی یک فایل متنی را کاراکتر به کاراکتر خوانده و چاپ می کنیم ، قبل از ادامه یک فایل متنی با نام Test.txt در درایو E ایجاد کرده و یک متن دلخواه در داخل آن نوشته و از کدهای زیر برای خواندن آن استفاده کنید :

import java.io.*;

public class BufferedReaderDemo
{
    public BufferedReaderDemo()
    {
        File myFile = new File("E:/Test.txt");

        InputStreamReader inputstreamreader = null;
        FileInputStream fileinputstream = null;
        BufferedReader bufferreader = null;

        try
        {
            fileinputstream = new FileInputStream(myFile);
            inputstreamreader = new InputStreamReader(fileinputstream);
            bufferreader = new BufferedReader(inputstreamreader);

            int c;
            while ((c = bufferreader.read()) != -1)
            {
                System.out.print((char)c);
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    public static void main(String[] args)
    {
        new BufferedReaderDemo();
    }
}

همانطور که در کد بالا مشاهده می کنید ابتدا باید فایلی که قصد خواندن از آن داریم را با یک شی از کلاس File مشخص کنیم (شی myFile در مثال بالا) سپس با استفاده از FileInputStream فایل مورد نظر را به یک جریان بایتی تبدیل کنیم (شی inputstreamreader در مثال بالا) و سپس جریان بایتی را با استفاده از InputStreamReader به جریان متنی تبدیل می کنیم (شی inputstreamreader در مثال بالا) ، برای بهینه سازی و افزایش سرعت خواندن یک BufferedReader از روی inputstreamreader ایجاد می کنیم. در ادامه با استفاده از متد read کاراکتر به کاراکتر از bufferreader میخوانیم و تا زمانی که نتیجه فراخوانی این متد -1 نباشد آن را در خروجی چاپ می کنیم.

خواندن از فایل با کمک یک آرایه

همانطور که در ابتدا دیدیم متد read دیگری نیز وجود دارد که از یک آرایه بافر برای خواندن از جریان ورودی استفاده می کند ، در بسیاری از کاربرد ها خواندن کاراکتر به کاراکتر زمان بر بوده و بهتر است با استفاده از یک آرایه بافر عملیات خواندن را تسریع بخشیم. مثال زیر به شرح این موضوع می پردازد :

import java.io.*;

public class BufferedReaderDemo
{
    public BufferedReaderDemo()
    {
        File myFile = new File("E:/Test.txt");
        InputStreamReader inputstreamreader = null;
        FileInputStream fileinputstream = null;
        BufferedReader bufferreader = null;

        char cbuf[] = new char[200];
        int readed;

        try
        {
            fileinputstream = new FileInputStream(myFile);
            inputstreamreader = new InputStreamReader(fileinputstream);
            bufferreader = new BufferedReader(inputstreamreader);
            readed = bufferreader.read(cbuf, 0, cbuf.length);

            for (int i = 0; i < readed; i++)
            {
                System.out.print(cbuf[i]);
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    public static void main(String[] args)
    {
        new BufferedReaderDemo();
    }
}

خروجی کد بالا مشابه مثال قبلی است. متغیر readed تعداد کاراکتر های خوانده شده از فایل را مشخص می کند.

خواندن با استفاده از متد readLine

کد زیر مشابه کد های قبلی است با این تفاوت که این بار از متد readLine برای خواندن خط به خط استفاده کنیم.

import java.io.*;

public class BufferedReaderDemo
{
    public BufferedReaderDemo()
    {
        File myFile = new File("E:/Test.txt");
        InputStreamReader inputstreamreader = null;
        FileInputStream fileinputstream = null;
        BufferedReader bufferreader = null;

        try
        {
            fileinputstream = new FileInputStream(myFile);
            inputstreamreader = new InputStreamReader(fileinputstream);
            bufferreader = new BufferedReader(inputstreamreader);

            String line;
            while ((line = bufferreader.readLine()) != null)
                System.out.println(line);

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

در کد بالا در داخل یک حلقه while تا زمانی که خروجی متد readLine برابر با null نباشد آن را چاپ می کنیم.