عکس پیش‌فرض نوشته

در انجام پروژه های دانشجویی در دانشگاه ها و حتی در برخی از پروژه های دنیای کسب و کار، هنگام برنامه نویسی با زبان برنامه نویسی جاوا (Java) گاهی اوقات نیاز است تا محتویات موجود درون یک فایل را خوانده و با توجه به رشته ها یا کاراکترهای موجود در فایل تصمیماتی بگیریم.

این فایل میتواند فایل دستورالعمل برنامه، تنظیمات، فایل خطاهای برنامه (error log) یا هر فایل متنی دیگری باشد.

خواندن فایل در برنامه نویسی java

 

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

– FileReader برای خواندن فایل های متنی که حاوی متون با انکودینگ پیشفرض سیستم شماست

– FileInputStream برای خواندن فایل های متنی که حاوی کاراکتر های خاص هستند

 

شئ FileReader معمولا باید به عنوان ورودی به BufferedFileReader داده شود؛ با این روش موجب صرفه جویی در داده ها خواهیم شد و میتوان در یک زمان، داده های فایل را به صورت خط به خط، کاراکتر به کاراکتر یا هر حالت دیگری مورد استفاده قرار داد.

 

در ادامه با نوشتن یک مثال و نمونه کدهای آن، چگونگی استفاده از FileReader را توضیح خواهیم داد.

اگر بخواهیم یک فایل متنی معمولی را با زبان برنامه نویسی JAVA بخوانیم؛ ابتدا باید کلاس های مورد استفاده را درون برنامه خود اضافه کنیم:

import java.io.BufferedReader;

import java.io.FileReader;

 

در این مثال فرض میکنیم یک فایل در فولدری که حاوی کلاس نوشته شده توسط ما هست، به نام config.bat وجود دارد که میخواهیم محتویات درون آنرا در برنامه بخوانیم.

به دلیل اینکه ممکن است فایل مورد نظر ما وجود نداشته باشد یا سطح دسترسی آن طوری تنظیم شده باشد که باز کردن و خواندن آن ممکن نباشد، کد ما در هنگام تلاش برای باز کردن فایل، با ارور مواجه میشود.

برای جلوگیری از روی دادن خطا یا استثنا (Exception) باید آنرا handle کنیم؛ بنابراین کدهای مربوط به باز کردن فایل و در ادامه، خواندن خط به خط محتویات آنرا درون یک بلوک try-catch گذاشته تا از بروز Exception ناخواسته جلوگیری کنیم؛ اکنون کلاس مربوط به مدیریت استثنا را نیز به پروژه خود اضافه میکنیم.

import java.io.IOException;

 

حال کدهای مربوط به کلاس و باز کردن فایل را به صورت زیر مینویسیم:

public class FileReadTest {
    public static void main(String [] args) {

        String fileName = "temp.txt";
        String line = null;

        try {
            FileReader fr = new FileReader(fileName);

            BufferedReader br = new BufferedReader(fileReader);

            //Not Complete ...!

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

 

همانطور که میبینید قطعه کد مربوط به باز کردن فایل مورد نظر، درون بلوک try-catch قرار گرفته تا از بروز Exception احتمالی جلوگیری کند.

شئ BufferedReader یک متد به نام readLine() دارد که در هر بار صدا زدن، یک خط از فایل باز شده را خروجی برمیگرداند؛ حال از این متد برای چاپ خطوط فایل استفاده میکنیم.

بدیهی است که به جای چاپ کردن، هر عملیات دیگری (مانند جستجو، ذخیره کردن و …) را میتوان انجام داد.

while( (line = bufferedReader.readLine() ) != null ) {
                System.out.println(line);
}

 

در قطعه کد فوق مقدار خطی که باید خوانده شود را درون متغیر line که پیش تر از این به صورت String تعریف شده بود با صدا زدن متد readLine() قرار داده و بررسی میکنیم که مقدار آن null نباشد (null بودن خروجی این متد به معنای اتمام خطوط موجود در فایل است) و سپس آنرا چاپ میکنیم.

پس از اینکه استفاده ما از فایل به اتمام رسید بهتر است آنرا ببنیدم تا از به وجود آمدن مشکلات احتمالی جلوگیری شود.

 

در نتیجه کد ما برای باز کردن و خواندن خط به خط یک فایل متنی معمولی با انکودینگ پیشفرض سیستم به صورت زیر خواهد بود. (در اکثر مواقع همین روش استفاده میشود.)

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileReadTest {
    public static void main(String [] args) {

        String fileName = "config.bat";
        String line = null;

        try {
            FileReader fr = new FileReader(fileName);

            BufferedReader br = new BufferedReader(fr);

            while( (line = br.readLine() ) != null ) {
                System.out.println(line);
            }

            br.close();

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

 

اکنون اگر بخواهیم یک فایل باینری یا فایلی محتوی کاراکترهایی که برای سیستم غیر قابل تشخیص و هضم است را باز کرده و پردازش کنیم باید به جای FileReader از FileInputStream استفاده کرد.

import java.io.FileInputStream;
import java.io.IOException;

public class BinaryFileReadTest {
    public static void main(String [] args) {

        String fileName = "config.bat";

        try {
            FileInputStream inputStream = new FileInputStream(fileName);

            int c = 0;
            while( (c = inputStream.read()) != -1 ) {
                System.out.print((char)(c));
            }

            inputStream.close();

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

 

در قطعه کد بالا برای خواندن یک Binary File از FileInputStream استفاده شده که این شئ یک متد با نام read() داشته و در هر بار صدا زدن آن، کد باینری (عددی) کاراکتر موجود را به ما باز میگرداند.

اگر در هنگام صدا زدن read() مقدار برگردانده شده -1 بود، به این معنی است که فایل به اتمام رسیده است.

برای چاپ کردن این کاراکتر مقدار عددی دریافت شده نیز آنرا تبدیل به کاراکتر (cast) کرده ایم.

 

 

توجه داشته باشید که در هر دو حالت، متغیر filename میتواند آدرس فایل مورد نظر (به صورت نسبی یا معمولی) در فرمت رشته (String) و یا یک شئ از کلاس File باشد.