کلاس RandomAccessFile

کلاس RandomAccessFile همانطور که از نام آن پیداست کلاسی با قابلیت “دسترسی تصادفی” به فایل است که به ما اجازه می دهد به صورت همزمان هم از فایل بخوانیم و هم در آن بنویسیم ، با استفاده از این کلاس با فایل به مثابه یک آرایه بزرگ برخورد می کنیم ، این فایل دارای ساختاری اندیسی یا اشاره گر گونه است که در هر لحظه به آخرین مکانی که عمل خواندن یا نوشتن در آن انجام شده است اشاره می کند، این کلاس با متد های مختلفی که در اختیار ما قرار می دهد کار با انواع داده های مختلف اعم از اعداد صحیح ، اعداد ممیز شناور ، رشته ها و … را بسیار آسان می سازد. برای استفاده از این کلاس باید از یکی از سازنده های زیر برای ساخت شی جدید از آن استفاده کنیم :

RandomAccessFile (File file,String mod)
RandomAccessFile (String fileName,String mod)

پارامتر mod

قبل از ادامه باید با پارامتر mod آشنا شویم ، این پارامتر نحوه دسترسی به فایل را مشخص می کند و می تواند یکی از موارد زیر باشد :

مقدار معنی
r مشخص می کند که فقط قصد خواندن از فایل را داریم.
rw مشخص می کند که قصد خواندن و نوشتن را داریم.
rws مشخص می کند که قصد خواندن و نوشتن داریم و تغییرات فایل یا متا دیتا باید سریعاً بر روی فایل اعمال شوند.
rwd مشابه مورد قبلی است با این تفاوت تغییر سریع متا دیتا الزامی نیست.

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

متد کاربرد
close () جریان ورودی-خروجی را بسته و منابع استفاده شده را آزاد می کند
length() اندازه فایل را بر حسب بایت بر می گرداند.
read() یک بایت از فایل میخواند.
read(byte[] b) یک آرایه از بایت ها را از فایل می خواند.
read(byte[] b,int offset,int length) قسمتی از آرایه b را با شروع از اندیس offset به تعداد lenght بایت را از فایل میخواند.
readBoolean() سعی می کند یک مقدار boolean از فایل بخواند.
readByte() یک بایت علامت دار از فایل میخواند.
readChar() یک کاراکتر از فایل میخواند.
readDouble() یک مقدار double از فایل میخواند.
readFloat() یک مقدار float از فایل میخواند.
readFully(byte[] b) متدی فوق العاده سریع برای خواندن یک آرایه از بایت است ، بهتر است از این متد برای خواندن کل فایل در عملیاتی همچون کپی کردن فایل یا مشابه آن استفاده کنیم.
readInt() یک مقدار int از فایل میخواند.
readLine() یک خط کامل از فایل میخواند.
readShort() یک مقدار short از فایل میخواند.
readUnsignedByte() یک هشت بیتی بی علامت از فایل می خواند.
readUnsignedShort() یک شانزده بیتی بی علامت از فایل میخواند.
readUTF() یک رشته با فرمت UTF را از فایل میخواند.
seek(long pos) مکان خوان از فایل را به موقعیت pos تغییر میدهد.
setLength(long length) اندازه فایل را تغییر می دهد.
write(byte[] b) یک آرایه از بایت ها را در فایل می نویسد.
write(byte[] b,int off,int len) یک آرایه از بایت ها را با شروع از اندیس off و به اندازه len در فایل می نویسد.
writeBoolean(boolean v) یک مقدار boolean در فایل می نویسد.
writeByte(int v) یک بایت در فایل می نویسد.
writeBytes(String s) یک رشته را به صورت آرایه ای از بایت ها در فایل می نویسد.
writeChar(int v) یک کاراکتر در فایل می نویسد.
writeChars(String s) یک رشته را به صورت آرایه ای از کاراکتر ها در فایل می نویسد.
writeDouble(double v) یک double در فایل می نویسد.
writeFloat(float v) یک مقدار float در فایل می نویسد.
writeInt(int v) یک مقدار int در فایل می نویسد.
writeLong(long v) یک مقدار long در فایل می نویسد.
writeShort(int v) یک مقدار short در فایل می نویسد.
writeUTF(String s) یک رشته با فرمت UTF را در فایل می نویسد.
   

خواندن از فایل

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

import java.io.*;

public class RandomAccessFileDemo
{
    public RandomAccessFileDemo()
    {
        File myFile = new File("G:/Test.txt");
        RandomAccessFile randomaccessfile = null;

        try
        {
            randomaccessfile = new RandomAccessFile(myFile, "r");

            String line;
            while ((line = randomaccessfile.readLine()) != null)
            {
                System.out.println(line);
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    public static void main(String[] args)
    {
        new RandomAccessFileDemo();
    }
}

در کد بالا پارامتر دوم RandomAccessFile مشخص می کند که تنها قصد خواندن از فایل را داریم ، در ادامه در یک حلقه while با استفاده از متد readLine یک خط از فایل میخوانیم و آن را چاپ می کنیم.زمانی که متد readLine مقدار null برگرداند به انتهای فایل رسیده ایم و از حلقه while خارج می شویم.

نوشتن در فایل

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

import java.io.*;

public class RandomAccessFileDemo
{
    public RandomAccessFileDemo()
    {
        File myFile = new File("G:/Test.txt");
        RandomAccessFile randomaccessfile = null;

        try
        {
            randomaccessfile = new RandomAccessFile(myFile, "rw");
            randomaccessfile.writeUTF("A B C\n");
            randomaccessfile.writeInt(20);
            randomaccessfile.writeFloat(3.14f);
            randomaccessfile.writeInt(80);
            randomaccessfile.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    public static void main(String[] args)
    {
        new RandomAccessFileDemo();
    }
}

در مثال بالا پارامتر دوم RandomAccessFile برابر با rw است و این بدان معنی است که قصد خواندن و نوشتن در فایل را داریم.با استفاده از متد writeUTF یک رشته در فایل می نویسیم بعد از آن یک مقدار int و سپس یک مقدار float و سپس یک مقدار int دیگر در فایل می نویسیم.

تست برنامه قبلی

اگر فایلی که در مثال قبلی ذخیره شد را در یک ادیتور متنی ساده مثل notepad باز کنید مشاهده می کنید که محتوای آن خوانا نیست ، برای اینکه از صحت کد قبل مطمئن شویم کد دیگری می نویسیم و مقدایر نوشته شده در فایل را می خوانیم و چاپ می کنیم.

import java.io.*;

public class RandomAccessFileDemo
{
    public RandomAccessFileDemo()
    {
        File myFile = new File("G:/Test.txt");
        RandomAccessFile randomaccessfile = null;

        try
        {
            randomaccessfile = new RandomAccessFile(myFile, "rw");

            String s = randomaccessfile.readUTF();
            System.out.println(s);

            int a = randomaccessfile.readInt();
            System.out.println(a);

            float f = randomaccessfile.readFloat();
            System.out.println(f);

            int b = randomaccessfile.readInt();
            System.out.println(b);

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

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