کار با فایل و ورودی و خروجی در جاوا

بنام خدا :

سلام خدمت دوستان . در این جلسه بخش اول مبحث کار با فایل در جاوا رو  داریم .

جاوا یکی از زبانهای قدرتمند  و بسیار انعطاف پذیر در زمینه کار با فایل هست . کلاسهای مربوط به کار با ورودی و خرو جی (که فایل هم یک مولفه ورودی و خروجی محسوب میشه) در java.io قرار داره. قبل از هرچیز با اصطلاح stream یا جریان بیشتر آشنا میشیم :

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

Byte Stream : وقتی داده ها در فرمت 8 بیتی یا همون یک بایتی ارسال میشن  بایت استریم مد نظر هست . کلاسهایی که با byte stream :ار میکنن زیادن ولی مهمترین و پر استفاده ترینشون دو کلاس  FileInputStream و FileOutputStream هستن .


import java.io.*;

public class CopyFile {
    public static void main(String args[]) throws IOException
    {
        FileInputStream in = null;
        FileOutputStream out = null;

    try {//این بخش مربوط به بلاکهای کنترل و کشف خطاست توی جلسات 
بعدی بهش خواهیم پرداخت
        in = new 
FileInputStream("input.txt");//تعریف یک جریان ورودی و تنظیم یک فایل متنی به عنوان منبع این جریان
        out = new FileOutputStream("output.txt");//تعریف یک جریان خروجی و تنظیم یک فایل بعنوان مقصد خروجی جریان داده ها
        int c;
        while ((c = in.read()) != -1) {//دریافت داده از فایل ورودی
        out.write(c);//نوشتن داده خوانده شده از فایل ورودی در فایل خروجی
                    
}
    }finally {
        if (in != null) {
            
in.close();//بستن فایل ورودی بعد از اتمام کار
        }
        if (out != null) {
            
out.close();//بستن فایل خروجی بعد ازاتمام کار
        }
     }
   }
}

باید توی مسیر پروژتون یک فایل input.txt داشته باشیم . و فرض کنیم که حاوی محتوی زیر هست :


i love appinapps 

حالا کد بالارو اجرا کنید و ببینید که یک فایل خروجی به نام output.txt ایجاد و محتوی فایل وردی رو توش کپی میکنه .

توی مثال زیر یک متن رو به داخل یک فایل خروجی از طریق Byte Stream ارسال و ذخیره میکنیم :


 import java.io.*; 
class Test{ 
    public static void main(String args[]){ 
        try{ 
            
FileOutputstream fout=new FileOutputStream("abc.txt");//ایجاد فایل خروجی 
            String s="i want to be good programmer"; 
            byte b[]=s.getBytes();//تبدیل متن به یک ارایه زا نوع بایت برای ارسال به شکل جریان بایتی
            
fout.write(b); // نوشتن کل آرایه بایتی در داخل فایل
            fout.close(); //بستن فایل
            
System.out.println("success..."); 
        }catch(Exception e){system.out.println(e);} //مدیریت خطاها که بعدا بهش میپردازیم 
    } 
}
 

Character Streams : برای نقل و انتقال داده برای مولفه های ورودی و خروجی  در فرمت 16 بیت unicode استفاده میشه . بازهم کلاسهای زیادی برای کار با این نوع جریان داده در جاوا وجو داره که  مهمترینشون FileReader و FileWriter هستن . تفاوتش با موارد قبلی اینه کا در هربار دو بایت منتقل میشه نه یک بایت . مثال قبلی رو اینبار با جریان کاراکتری (Character Stream) انجام میدیم :


import java.io.*;

public class CopyFile {
    public static void main(String args[]) throws IOException
    {
        FileReader in = null;
        FileWriter out = null;

        try {
            in = new FileReader("input.txt");
            out = new FileWriter("output.txt");

            int c;
            while ((c = in.read()) != -1) {
            out.write(c);
              }
        }finally {
        if (in != null) {
            in.close();
            }
        if (out != null) {
            out.close();
            }
        }
    }    
}

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

Standard Streams :

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

Standard Input : برای دریافت ورودی از کاربر هست که معمولا بصورت ورودی از کیبورد محسوب میشه و کلاسش System.in هست .

Standard Output : برای چاپ اطلاعات در خروجی که معمولا صحه نمایش هست استفاده میشه System.out

Standard Error : برای نوشتن خطاهای مربوط به برنامه کاربر هست که معمولا اون هم  در صفحه نمایش نشون داده میشه System.err

مثال زیر برنامه ای رو نشون میده که داده هارو کارکتر به کارکتر الز وردی دریافت میکنه و در خروجی چاپ میکنه و اینکار رو تا زمان زدن دکمه 'q' از طرف کاربر ادامه میده :


import java.io.*;

public class ReadConsole {
    public static void main(String args[]) throws IOException
    {
        InputStreamReader cin = null;

        try {
            cin = new 
InputStreamReader(System.in);//خواند ن ا ورودی از ورودی استاندارد بصورت بایتی
            
System.out.println("Enter characters, 'q' to quit.");//چاپ پیغام برای کاربر از 
طریق خروجی استاندارد
            char c;
            do {
                
c = (char) cin.read();//خواندن کاراکتر به کارکتر فایل ورودی
                
System.out.print(c);//نوشتن هر کارکتر در خروجی استاندارد که همون صفحه نمایش باشه
            } while(c != 
'q');//زدن دکمه شرط توقف
        }finally {
            if (cin != 
null) {
            
cin.close();//بستن فایل کاری که همیشه بعد از اتمام کار با فایل باید انجام بدیم
        }
      }
    }
}

اگه برنامه بالا رو اجرا کنید  هر کاراکتری که بزنید عین اون توی خروجی چاپ میشه تازمان زدن کاراکتر q


Enter characters, 'q' to quit.
N
N
e
e
q
q

ادامه این مبحث در جلسه بعد انشالله ....


فایلهای ضمیمه
توجه! هیچ فایل ضمیمه ای برای این مطلب یافت نشد

نظرات شما نظر جدید