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

کار با فایل‌ها و ورودی و خروجی در جاوا
مرداد ۱۹, ۱۳۹۸ No Comments javascript زهرا ابراهیمی

بسته java.io شامل تقریباً هر کلاسی است که شما ممکن است روزی نیاز به انجام ورودی و خروجی (I / O) در جاوا داشته باشید. همه این جریان‌ها یک منبع ورودی و یک مقصد خروجی دارند. جریان در بسته java.io بسیاری از داده‌ها مانند داده‌های اولیه، موضوعی، کاراکترهای محلی و غیره را پشتیبانی می‌کند.

جریان

جریان به‌عنوان یک توالی از داده‌ها تعریف شود. به‌طور کلی دو نوع جریان وجود دارد:

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

آشنایی با فایل هاورودی و خروجی در جاوا

جاوا پشتیبانی قوی و قابل‌انعطافی برای ورودی و خروجی  فایل‌ها و شبکه‌ها را فراهم می‌کند. اما این آموزش قابلیت‌های بسیار اساسی مربوط به جریان‌ها و ورودی/خروجی را پوشش می‌دهد. در زیر به  نمونه‌هایی که اغلب مورداستفاده قرار می‌گیرند اشاره می‌کنیم:

جریان بایت

جریان‌های بایت جاوا برای اجرای عملیات ورود و  خروج  از بایت‌های ۸ بیتی استفاده می‌کنند. اگرچه کلاس‌های زیادی در ارتباط با جریان‌های بایت وجود دارد اما اغلب کلاس‌های استفاده‌شده 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  ایجاد کرده‌ایم را باهم ببینیم.

This is test for copy file.

گام بعدی این است که برنامه فوق را کامپایل و آن را اجرا کنید، که در نتیجه آن، فایل output.txt با محتوای مشابه در input.txt قرار خواهد گرفت. حال بیایید باهم کد بالا را در فایل CopyFile.java قرار داده و موارد زیر را انجام دهیم:

$javac CopyFile.java

$java CopyFile

جریان کاراکتر

همان‌طور که قبلاً گفته شد، جریان‌های بایت جاوا برای انجام ورودی و خروجی از بایت‌های ۸ بیتی استفاده می‌کنند، درحالی‌که جریان‌های کاراکتر جاوا برای انجام ورودی و خروجی از یونیکد ۱۶ بیتی استفاده می‌کنند. اگرچه کلاس‌های زیادی برای جریان‌های کاراکتر وجود دارد اما بیشتر کلاس‌های استفاده‌شده از نوع FileReader  و FileWriter هستند. اگرچه در داخل FileReader از FileInputStream استفاده می‌شود و FileWriter هم از FileOutputStream استفاده می‌کند، اما در اینجا تفاوت عمده این است که FileReader دو بایت را در هم‌زمان می‌خواند و FileWriter هر دو بایت را هم‌زمان می‌نویسد.

در ادامه مثال فوق را دوباره می‌نویسیم تا استفاده از این دو کلاس را برای کپی کردن یک فایل ورودی (دارای کاراکترهای Unicode) به یک فایل خروجی مشاهده کنیم.

مثال

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();

         }

      }

   }

}

با اجرای کد بالا یک فایل input.txt با محتوای زیر خواهید داشت.

This is test for copy file.

درست مانند قبل، برنامه فوق را کامپایل و آن را اجرا کنید. در نتیجه این کار، فایل output.txt با محتوای مشابه در input.txt قرار خواهد گرفت. بنابراین اجازه دهید کد بالا را در فایل CopyFile.java قرار دهیم و موارد زیر را انجام دهیم:

$javac CopyFile.java

$java CopyFile

جریان‌های استاندارد

تمام زبان‌های برنامه‌نویسی پشتیبانی  استانداردی از ورودی/خروجی ارائه می‌دهند.در این  برنامه‌ها کاربر می‌تواند با استفاده از  صفحه‌کلید اطلاعات وارد کند و سپس  خروجی موردنظر را روی صفحه کامپیوتر مشاهده کند. اگر شما از زبان برنامه‌نویسی C یا C++ آگاهی دارید، بایستی اطلاعاتی از سه استاندارد STDIN، STDOUT و STDERR داشته باشید. به‌طور کلی، جاوا سه جریان استاندارد زیر را فراهم می‌کند:

  • ورودی استاندارد – از این ورودی برای تغذیه داده‌ها به برنامه کاربر استفاده می‌شود و معمولاً یک صفحه‌کلید به‌عنوان جریان ورودی استاندارد استفاده می‌شود و به‌عنوان System.in نمایش داده می‌شود.
  • خروجی استاندارد – این خروجی برای داده‌های تولیدشده توسط برنامه کاربر استفاده می‌شود و معمولاً یک صفحه کامپیوتر برای جریان خروجی استاندارد استفاده می‌شود و به‌عنوان System.out نمایش داده می‌شود.
  • خطای استاندارد – از این خطا برای تولید خطاهای تولیدشده توسط برنامه کاربر استفاده می‌شود و معمولاً یک صفحه کامپیوتر برای جریان خطای استاندارد استفاده می‌شود و به‌عنوان System.err نمایش داده می‌شود.

در زیر یک برنامه ساده  وجود دارد که InputStreamReader  برای خواندن ایجاد می‌کند تا زمانی که کاربر حرف  “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();

         }

      }

   }

}

کد بالا را در فایل ReadConsole.java نگه‌دارید و سعی کنید آن را همان‌طور که در برنامه زیر نشان داده شده است، کامپایل و اجرا کنید. این برنامه همچنان به خواندن و خروجی گرفتن از کاراکتر مشابه تا زمانی که  ‘q’ را فشار دهید ادامه می‌دهد.

$javac ReadConsole.java

$java ReadConsole

Enter characters, ‘q’ to quit.

۱

۱

e

e

q

q

خواندن و نوشتن فایل‌ها

همان‌طور که قبلاً توضیح داده شد، یک جریان می‌تواند به‌عنوان دنباله‌ای از داده‌ها تعریف شود. InputStream برای خواندن داده‌ها از یک منبع استفاده می‌شود و OutputStream برای نوشتن داده‌ها به مقصد استفاده می‌شود.

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

خواندن و نوشتن فایل ها

در ادامه دو جریان مهم FileInputStream و FileOutputStream در این آموزش موردبحث قرار خواهد گرفت.

FileInputStream

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

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

InputStream f = new FileInputStream(“C:/java/hello”);

با پیروی از این  ساختار نیز، موضوع  فایل یک جریان ورودی برای خواندن فایل ایجاد می‌کند. در ابتدا فایل را با استفاده از روش File () به صورت زیر ایجاد می‌کنیم:

File f = new File(“C:/java/hello”);

InputStream f = new FileInputStream(f);

با در اختیار داشتن InputStream ، لیستی از روش‌های کمکی وجود دارد که می‌توانید آن‌ها را برای خواندن یا انجام عملیات دیگر در جریان استفاده کنید.

ردیفروش و متد
۱public void close() throws IOException{}

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

۲protected void finalize()throws IOException {}

این روش اتصال را به فایل پاک می‌کند. روش نزدیک این جریان خروجی، فایل نامیده می‌شود زمانی که هیچ اشاره‌ای به این جریان وجود ندارد.

۳ 

public int read(int r)throws IOException{}

این روش بایت مشخص‌شده داده از InputStream را می‌خواند. یک int را بازگردانده و  بایت بعدی داده‌ها را برمی‌گرداند و اگر پایان فایل باشد،  برگشت  خواهد داشت.

۴public int read(byte[] r) throws IOException{}

این روش، r.length bytes از جریان ورودی به آرایه را می‌خواند. تعداد کل بایت‌های خوانده‌شده را پردازش کرده و اگر پایان فایل باشد برگشت خواهد داشت

۵public int available() throws IOException{}

تعداد بایت‌هایی را می‌توان از این جریان ورودی خواند. این دستور یک int را بازمی‌گرداند.

دیگر جریان‌های ورودی مهم در دسترس وجود دارد، برای جزئیات بیشتر شما می‌توانید به لینک‌های زیر مراجعه کنید

FileOutputStream

FileOutputStream برای ایجاد یک فایل و نوشتن اطلاعات در آن استفاده می‌شود. جریان، اگر قبل از آن وجود نداشته باشد، قبل از باز کردنش برای خروجی، یک فایل ایجاد می‌کند.

در اینجا دو سازنده هستند که می‌توانند برای ایجاد FileOutputStream استفاده شوند.

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

OutputStream f = new FileOutputStream(“C:/java/hello”)

پیروی از این ساختار، یک جریان خروجی برای نوشتن فایل می‌گیرد. در ابتدا یک فایل موضوعی با استفاده از روش File () به صورت زیر ایجاد می‌کنیم:

File f = new File(“C:/java/hello”);

OutputStream f = new FileOutputStream(f);

هنگامی‌که OutputStream در دسترس است، لیستی از روش‌های کمکی وجود دارد که می‌تواند برای نوشتن  جریان یا انجام عملیات دیگر  جریان استفاده شود.

ردیف روش و توضیح آن
۱public void close() throws IOException{}

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

۲protected void finalize()throws IOException {}

این روش اتصال را به فایل پاک می‌کند و زمانی که هیچ اشاره‌ای به این جریان وجود ندارد اطمینان حاصل می‌کند که روش نزدیک این جریان خروجی، فایل نامیده می‌شود.

۳public void write(int w)throws IOException{}

این روش بایت مشخص‌شده را روی جریان خروجی می‌نویسد.

۴public void write(byte[] w)

بایت‌هایw.length را  از آرایه بایت ذکرشده به OutputStream می‌نویسد

 جریان‌های مهم خروجی دیگری نیز در دسترس هستند، برای جزئیات بیشتر شما می‌توانید به لینک‌های زیر مراجعه کنید

مثال

در زیر نمونه‌ای برای نشان دادن InputStream و OutputStream معرفی می‌شود

import java.io.*;

public class fileStreamTest {

   public static void main(String args[]) {

      try {

         byte bWrite [] = {11,21,3,40,5};

         OutputStream os = new FileOutputStream(“test.txt”);

         for(int x = 0; x < bWrite.length ; x++) {

            os.write( bWrite[x] );   // writes the bytes

         }

         os.close();

         InputStream is = new FileInputStream(“test.txt”);

         int size = is.available();

         for(int i = 0; i < size; i++) {

            System.out.print((char)is.read() + ”  “);

         }

         is.close();

      } catch (IOException e) {

         System.out.print(“Exception”);

      }

   }

}

کد بالا فایل test.txt را ایجاد می‌کند و اعداد داده شده را در قالب باینری می‌نویسد. همان خروجی روی صفحه‌نمایش stdout نمایش داده خواهد شد.

فایل‌های راهنمای ورودی/خروجی

چندین کلاس دیگر برای فهم مبانی فایل‌های راهنمای ورودی/ خروجی وجود دارد که ما می‌توانیم از آن‌ها پیروی کنیم.

  • r

پوشه‌ها در جاوا

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

ایجاد پوشه

دو روش مفید و سودمند برای ایجاد پوشه وجود دارد که می‌تواند به‌راحتی استفاده شود

روش mkdir( ) پوشه‌ای را ایجاد می‌کند. عدم موفقیت در ایجاد آن نشان می‌دهد که مسیر مشخص‌شده در حال حاضر وجود دارد یا اینکه پوشه نمی‌تواند ایجاد شود، زیرا کل مسیر هنوز وجود ندارد.

روش mkdirs () هر دو پوشه  و تمام زیرمجموعه‌های  پوشه را ایجاد می‌کند.

حال می‌خواهیم با مثالی مسیر زیر را ایجاد کنیم

“/tmp/user/java/bin”

مثال

import java.io.File;

public class CreateDir {

   public static void main(String args[]) {

      String dirname = “/tmp/user/java/bin”;

      File d = new File(dirname);

      // Create directory now.

      d.mkdirs();

   }

}

در نهایت کد بالا را کمپایل و اجرا کنید.

نکته: جاوا به‌طور خودکار از جداکننده‌های مسیر بر روی یونیکس و ویندوز به‌عنوان قرارداد استفاده می‌کند. اگر از اسلش (/) در نسخه ویندوز جاوا استفاده کنید،  مسیر درست حل خواهد شد.

لیست کردن پوشه‌ها

شما می‌توانید از روش list( ) برای  لیست کردن تمام فایل‌ها و پوشه‌های موجود در یک پوشه مرجع به صورت زیر استفاده کنید

مثال

import java.io.File;

public class ReadDir {

   public static void main(String[] args) {

      File file = null;

      String[] paths;

      try {

         // create new file object

         file = new File(“/tmp”);

         // array of files and directory

         paths = file.list();

         // for each name in the path array

         for(String path:paths) {

            // prints filename and directory name

            System.out.println(path);

         }

      } catch (Exception e) {

         // if any error occurs

         e.printStackTrace();

      }

   }

}

نتایج زیر بر اساس پوشه‌ها و فایل‌های موجود در دایرکتوری /tmp شما تولید می‌شود.

خروجی

test1.txt

test2.txt

ReadDir.java

ReadDir.class

آنچه در مطلب بعدی خواهید خواند

در مطلب بعدی آموزش جاوا که آخرین مطلب از بخش اول آموزش جاوا می‌باشد کلاس‌های داخلی در جاوا را مورد بررسی قرار خواهیم داد با ما همراه باشید.

tutorialspoint

Tags
درباره نویسنده

Leave a reply

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *