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

در برنامه نویسی پروژه های مختلف، گاهی اوقات نیاز داریم اطلاعاتی را درون یک فایل ذخیره کنیم؛ این اطلاعات میتواند Log سیستم، خروجی برنامه یا حتی یک پایگاه داده ساده باشد.

در زبان برنامه نویسی جاوا (Java) میتوانیم به راحتی یک فایل را ایجاد کرده و اطلاعاتی درون آن ثبت کنیم و یا اطلاعات خود را به انتهای آن اضافه کنیم.

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

 

قبلا در مورد چگونگی خواندن یک فایل در زبان برنامه نویسی جاوا در سایت صحبت کردیم.

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

FileWriter : برای نوشتن فایل های متنی ساده (با انکودینگ پیشفرض سیستم)

FileOutputStream : جهت نوشتن فایل هایی که حاوی کاراکتر های خاص هستند. (و به طور کلی فایل های باینری)

 

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

import java.io.BufferedWriter;

import java.io.FileWriter;

 

وقتی یک شی از FileWriter می سازیم باید آنرا به BufferedWriter به عنوان ورودی بدهیم تا بتوانیم سایر عملیات های نوشتن روی فایل را انجام دهیم. به همین دلیل کلاس مربوط به آنرا نیز در بالا اضافه کرده ایم.

به جهت آنکه کد ما کامل باشد و بتواند بدون خطا کار کند، باید Exception Handling نیز داشته باشیم. اگر دسترسی لازم برای ایجاد فایل جدید یا نوشتن روی فایلِ از پیش ایجاد شده را نداشته باشیم، برنامه ما با خطا مواجه خواهد شد، بنابراین بهتر است این خطا ها و استثناها را مدیریت کنیم.

import java.io.IOException;

 

زمانی که میخواهیم روی یک فایل عملیات نوشتن را انجام دهیم، دو حالت کلی پیش رو داریم:

– فایلی با نام و مسیر مورد نظر ما از قبل وجود نداشته باشد؛ در اینصورت برنامه ابتدا فایل را ساخته و سپس به نوشتن درون آن می پردازد.

– فایل وارد شده وجود داشته باشد؛ در اینصورت محتویات قبلی فایل حذف شده و برنامه شروع به نوشتن در آن میکند.

 

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

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

        try {
            FileWriter fw = new FileWriter("temp.txt");

            BufferedWriter bw = new BufferedWriter(fw);

            // Codes to write line here ...

            bw.close();
        }
        catch(IOException ex) {
            ex.printStackTrace();
        }
    }
}

 

در این مثال فرض میکنیم فایلی با نام temp.txt در کنار این کلاس وجود دارد و اگر وجود ندارد، میخواهیم آنرا ایجاد کنیم.

همانطور که در کد مشاهده میکنید، سازنده BufferedWriter یک شی از نوع FileWriter را به عنوان ورودی خود میگیرد.

 

شی از نوع کلاس BufferedWriter یک متد با نام write دارد که یک رشته به عنوان ورودی گرفته و آنرا درون فایل مربوطه مینویسد.

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

شی bw متدی با نام newline دارد که کاراکتر مربوط به خط جدید را به فایل اضافه میکند.

یک کد نمونه برای نوشتن درون فایل به صورت زیر می باشد.

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

        try {
            FileWriter fw = new FileWriter("temp.txt");

            BufferedWriter bw = new BufferedWriter(fw);

            bw.write("Hello dear users,");
            bw.write(" here is some text from SabzElco.IR.");
            bw.newLine();
            bw.write("We are writing");
            bw.write(" the text to temp.txt file.");

            bw.close();
        }
        catch(IOException ex) {
            ex.printStackTrace();
        }
    }
}

 

یادآوری میشود که بعد از اتمام کار، بهتر است فایل را به اصطلاح ببندیم (با صدا زدن Close روی شی) تا از به وجود آمدن مشکلات احتمالی جلوگیری کنیم.

 

دقت کنید که وقتی فایل را با فراخوانی FileWrite باز میکنیم، تمام محتویات قبلی موجود درون آن حذف میشود و تا زمانی که در حال نوشتن هستیم، از متد write به هر تعداد که استفاده کنیم، در حال اضافه کردن به محتویات جدید فایل هستیم.

حال اگر بخواهیم محتویات قبلی فایل تغییر نکند و صرفا اطلاعاتمان را به انتهای فایل اضافه کنیم؛ بایستی ابتدا فایل را به جهت افزودن اطلاعات باز کنیم. برای این کار از ورودی دوم سازنده FileWrite استفاده میکنیم.

ورودی دوم FileWrite یک boolean است که مشخص میکند فایل مورد نظر را میخواهیم برای افزودن اطلاعات باز کنیم یا نوشتن اطلاعات جدید. مقدار پیشفرض این ورودی false به معنای نوشتن اطلاعات جدید است. حال که میخواهیم اطلاعاتی را به انتهای فایل اضافه کنیم مقدار این ورودی را true تعریف میکنیم. اکنون محتویات قبلی موجود در فایل حذف نخواهد شد.

برای افزودن رشته های مورد نظر خود، این بار از متد append مربوط به شی bw استفاده خواهیم کرد.

در حالت کلی چیزی شبیه به کد زیر خواهیم داشت.

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

        try {
            FileWriter fw = new FileWriter("temp.txt", true);

            BufferedWriter bw = new BufferedWriter(fw);

            bw.append(" ");
            bw.append("This text has been appended to the file!");

            bw.close();
        }
        catch(IOException ex) {
            ex.printStackTrace();
        }
    }
}

 

 

اکنون اگر بخواهیم یک فایل باینری را ایجاد کرده و روی آن بنویسیم باید به جای FileWirter از FileOutputStream استفاده کنیم.

فایل باینری ما میتواند یک عکس، فایل متنی حاوی کاراکترهای خاص و یا هر چیز دیگری باشد.

در این مثال یک متن ساده را تبدیل به باینری کرده و سپس درون فایل به صورت باینری ذخیره میکنیم.

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

        try {
            String str = "Hello World!";
            byte[] buffer = str.getBytes();

            FileOutputStream outputStream = new FileOutputStream("temp.txt");

            outputStream.write(buffer);

            outputStream.close();
        }
        catch(IOException ex) {
            ex.printStackTrace();
        }
    }
}

 

متد write مربوط به شئ outputStream چند بایت اطلاعات را گرفته و همه آنها را درون فایل مینویسد. به جای آن میتوان از متد زیر استفاده کرد تا اطلاعات باینری buffer را از یک offset خاص به تعداد (length) مشخص، درون فایل بنویسد.

outputStream.write(buffer, offset, length);

 

کلاس های دیگری نیز برای نوشتن فایل در زبان برنامه نویسی جاوا وجود دارد؛ نظیر PrintWriter که معمولا برای نوشتن متن های دارای فرمت خاص استفاده میشود.

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