در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

آموزش جاوا (Java) قسمت 25 : کار با استریم ها و فایل ها

با سلام و عرض تبریک عید نوروز به همه دوستان و همراهان Itpro. در ادامه مباحث آموزش جاوا در این مطلب بررسی I/O و فایل ها در جاوا می پردازیم و کار با فایل ها در جاوا را مورد بررسی قرار خواهیم داد. زبان جاوا همه کلاس هایی را که برای کار با فایل ها فراهم کرده است را در داخل یک پکیج به نام java.io قرار داده است. استریم ها در جاوا دارای دو بخش منبع ورودی و مقصد خروجی می باشد. استریم ها در پکیج java.io از داده های مختلفی مانند انواع داده های اولیه و اشیاء و کاراکترهای محلی پشتیبانی می کنند.

Stream استریم ها

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

  1. استریم ورودی (InPutStream) این نوع استریم برای خواندن داده ها از منبع ورودی به کار می رود.
  2. استریم خروجی(OutPutStream) این استریم برای نوشتن داده ها در مقصد خروجی به کار می رود.

آموزش جاوا (Java) قسمت 25 : کار با استریم ها و فایل ها

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

استریم های بایتی Byte Streams

استریم های بایتی جاوا برای ورودی و خروجی داده های 8 بیتی مورد استفاده قرار می گیرد. با این که تعداد کلاس های زیاد هستند که با این نوع استریم ها کار می کنند ولی پرکاربرد ترین کلاس ها برای این نوع استریم ها 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("d:\\input.txt");
         out = new FileOutputStream("d:\\output.txt");
         
         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

This is test for copy file.

استریم های کاراکتری Character Streams

همان گونه که گفتیم استریم های بایتی برای خواندن و نوشتن داده های بایتی با تعداد 8 بیت مورد استفاده قرار می گرفتند ولی استریم های کاراکتری برای خواندن و نوشتن داده هایی که تعداد 16 بیت طول دارند انجام می شود. کلاس هایی که برای کار با این نوع داده ها بسیار مورد استفاده قرار می گیرد کلاس های FileReader, FileWriter هستند. کلاس FileReader به شکل داخلی از کلاس FileInputStream استفاده می کند و کلاس FileWriter نیز به طور داخلی از کلاس FileOutputStream استفاده می کند ولی یک تفاوت عمده بین این دو دسته کلاس وجود دارد و آن هم این است که کلاس های استریم کاراکتری در واحد زمان با دو کاراکتر کار می کنند یعنی FileReader در واحد زمان دو بایت می خواند و FileWriter در واحد زمان 2 بایت در خروجی می نویسد. در قطعه کد زیر مثال بالا با استفاده از دو کلاس گفته باز نویسی شده است که فایل ورودی را در فایل خروجی کپی می کند.

import java.io.*;

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

      try {
         in = new FileReader("d:\\input.txt");
         out = new FileWriter("d:\\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 موجود باشد محتویات آن در فایل output.txt ریخته می شود.

استریم های استاندارد Standard Stream

همه ی زبان های برنامه نویسی از IO استاندارد پشتیبانی می کنند. IO استاندارد به این معنی است که بتوان کلید ها و کاراکترهای وارد شده از کیبورد را خواند و کاراکترهایی را که لازم داریم در صفحه نمایش نشان دهیم. اگر شما با زبان 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();
         }
      }
   }
}

حال اگر برنامه بالا را اجرا کنیم خروجی برنامه شبیه به خطوط زیر خواهد بود:

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

کاربا فایل ها

همانطور که گفتیم یک استریم دنباله ای از داده ها است و گفتیم که InputStream برای خواندن داده ها از منبع و OutputStream برای نوشتن داده ها در مقصد به کار می رود. در شکل زیر سلسله مراتب کلاس هایی که با استریم ها کار می کنند آورده شده است.

آموزش جاوا (Java) قسمت 25 : کار با استریم ها و فایل ها

در این مطلب دو استریم مهم را بررسی می کنیم که آنها FileInputStream و FileOutputStream خواهد بود.

FileInputStream

این استریم برای خواندن داده ها از فایل ها استفاده می شود. اشیای این استریم می توانند با استفاده از کلمه کلیدی new ساخته شودن و دارای constructor های متنوعی هستند برای مثال constructor زیر مسیر فایل را به صورت متنی دریافت می کند و یک شئ استریم می سازد. تا بتواند فایل را بخواند.

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

در constructor زیر ابتدا یک شئ فایل می سازیم و سپس برای فایل ساخته شده یک استریم می سازیم تا بتوانیم آن را بخوانیم. برای ساخت شئ فایل از کلاس File استفاده می کنیم و باید هنگام ساخت شئ فایل مسیر فایل را به آن بدهیم.

File f = new File("C:/java/hello");
InputStream f = new FileInputStream(f);

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

  1. متد close: این متد استریم خروجی فایل را می بندد و همه منابعی که سیستم برای آن فایل گرفته بود را آزاد می کند. این متد ممکن است که یک خطای IOException تولید کند که باید توسط کاربر در نظر گرفته شود. این متد هیچ ورودی نداشته و چیزی برنمی گرداند.
  2. متد finalize: این متد همه ی اتصالات به فایل را حذف می کند و مطمئن می شود که متد close این استریم فراخوانی شده است. این متد نیز ممکن است که خطای IOException تولید کند. این متد هیچ ورودی نداشته و چیزی برنمی گرداند. همانطور که در قسمت متدها گفته شده این متد برای از بین بردن اشیا استفاده می شود.
  3. متد read این متد یک مقدار ورودی می گیرد که این ورودی می تواند یک مقدار عددی باشد و این به این معنی است که بایتی را که شماره آن را داده ایم می خواند و بایت بعدی را برمی گرداند و اگر به انتهای فایل رسیده باشیم مقدار -1 را برمی گرداند. این متد نیز ممکن است خطای IOException تولید کند
  4. متد available این متد یک مقدار عددی برمی گرداند و عدد بازگردانده شده به تعداد بایت هایی است که می توان از این فایل خواند.

استریم های مهم دیگری هم برای ورود اطلاعات وجود دارد که آنها را بعدا توضیح خواهیم داد. که این استریم ها عبارتند از: ByteArrayInputStream و DataInputStream

FileOutpuStream

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

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

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

File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);

شئی که از استریم خروجی فایل ساخته شده است متدهای متفاوتی دارد که می توان از آن برای اعمال مختلف استفاده کرد که در ادامه به توضیح چند عدد از آنها پرداخته ایم:

#متد close این متد استریم خروجی را می بندد و همه منابع را از آن پس می گیرد. این متد مانند متد استریم ورودی ممکن است خطای IOException تولید کند. همچنین این استریم متدی با نام finalize دارد که آن را قبلا توضیح دادیم.

#متد write این متد یک ورودی عددی دارد که بایت ورودی را در داخل استریم می نویسد. این متد نیز ممکن است که خطای IOException تولید کند. همچنین این متد ممکن است که یک ورودی آرایه ای از نوع byte داشته باشد که در این صورت خانه های آرایه را در داخل استریم خروجی می نویسد.

البته استریم های دیگری برای خروجی نیز وجود دارد که بعدا به توضیح آنها خواهیم پرداخت. برنامه زیر یک مثال از استریم های ورودی و خروجی می باشد که برای درک بهتر این استریم ها کمک می کند. در این برنامه یک آرایه از نوع byte می سازیم و آن را در فایل test.txt می نویسیم و سپس از آن می خوانیم و در صفحه نمایش آن را نشان می دهیم.

import java.io.*;

public class fileStreamTest{

   public static void main(String args[]){
   
   try{
      byte bWrite [] = { 75,106,3,48,95 };
      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");
   }	
   }
}

خروجی این برنامه به شکل زیر خواهد بود

K  j     0  _  

دقت داشته باشید که مقادیری که نوشته می شوند تبدیل به کاراکتر شده و نوشته می شوند. برای همین شما باید کد اسکی کاراکتر را بنویسید.

Itpro باشید

نویسنده: مهدی عادلی فر

منبع: جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

#کار_با_فایل_ها_در_جاوا #برنامه_نویسی_جاوا #کار_با_استریم_ها_در_جاوا #آموزش_برنامه_نویسی_جاوا #خواندن_و_نوشتن_فایل_ها_در_جاوا #آموزش_جاوا #منظور_از_استریم_چیست؟ #دایرکتوری_ها_در_جاوا #فایل_ها_در_جاوا #دوره_آموزشی_جاوا
عنوان
1 آموزش جاوا (Java) قسمت 1 : معرفی ، خصوصیات و شروع به کار رایگان
2 آموزش جاوا (Java) قسمت 2 : شی گرایی قسمت یک رایگان
3 آموزش جاوا (Java) قسمت 3: شی گرایی قسمت دو رایگان
4 آموزش جاوا (Java) قسمت 4 : شی گرایی قسمت سه رایگان
5 آموزش جاوا (Java) قسمت 5 : انواع داده رایگان
6 آموزش جاوا (Java) قسمت 6 : انواع متغیر رایگان
7 آموزش جاوا (Java) قسمت 7 : Modifier ها رایگان
8 آموزش جاوا (Java) قسمت 8 : عملگرها قسمت یک رایگان
9 آموزش جاوا (Java) قسمت 9 : عملگرها قسمت دو رایگان
10 آموزش جاوا (Java) قسمت 10 : حلقه های تکرار رایگان
11 آموزش جاوا (Java) قسمت 11 : عبارات شرطی رایگان
12 آموزش جاوا (Java) قسمت 12 : کلاس Wrapper اعداد رایگان
13 آموزش جاوا (Java) قسمت 12 : کلاس Wrapper اعداد رایگان
14 آموزش جاوا (Java) قسمت 14: کلاس Wrapper کاراکترها رایگان
15 آموزش جاوا (Java) قسمت 15 : کلاس String و کار با رشته قسمت یک رایگان
16 آموزش جاوا (Java) قسمت 16 : کلاس String و کار با رشته قسمت دو رایگان
17 آموزش جاوا (Java) قسمت 17 : کلاس String و کار با رشته قسمت سه رایگان
18 آموزش جاوا (Java) قسمت 18 : کلاس String و کار با رشته قسمت چهار رایگان
19 آموزش جاوا (Java) قسمت 19 : StringBuilder و StringBuffer رایگان
20 آموزش جاوا (Java) قسمت 20 : استفاده از آرایه ها رایگان
21 آموزش جاوا (Java) قسمت 21 : آموزش کار با تاریخ رایگان
22 آموزش جاوا (Java) قسمت 22 : عبارات منظم (Regular Expression) رایگان
23 آموزش جاوا (Java) قسمت 23 : تعریف و استفاده از متدها قسمت یک رایگان
24 آموزش جاوا (Java) قسمت 24 : تعریف و استفاده از متدها قسمت دو رایگان
25 آموزش جاوا (Java) قسمت 25 : کار با استریم ها و فایل ها رایگان
26 آموزش جاوا (Java) قسمت 26 : کار با دایرکتوری ها رایگان
27 آموزش جاوا (Java) قسمت 27 : کلاس ByteArrayInputStream رایگان
28 آموزش جاوا (Java) قسمت 28 : معرفی کلاس File و متدها رایگان
29 آموزش جاوا (Java) قسمت 29 : معرفی و شرح Exception ها قسمت 1 رایگان
30 آموزش جاوا (Java) قسمت 30 : معرفی و شرح Exception ها قسمت 2 رایگان
31 آموزش جاوا (Java) قسمت 31 : معرفی و شرح Exception ها قسمت 3 رایگان
32 آموزش جاوا (Java) قسمت 32 : استفاده از انوع کلاس های داخلی رایگان
33 آموزش جاوا (Java) قسمت 33 : وراثت کلاس ها و انواع آن رایگان
34 آموزش جاوا (Java) قسمت 34 : Override کردن متد ها رایگان
35 آموزش جاوا (Java) قسمت 35 : چند ریختی (Polymorphism) رایگان
36 آموزش جاوا (Java) قسمت 36 : Enum و ویژگی های آن رایگان
37 آموزش جاوا (Java) قسمت 37 : معرفی Abstract رایگان
38 آموزش جاوا (Java) قسمت 38 : استفاده از کپسول بندی (Encapsulation) رایگان
39 آموزش جاوا (Java) قسمت 39 : استفاده از اینترفیس ها رایگان
40 آموزش جاوا (Java) قسمت 40 : پکیج(Package) و نحوه استفاده رایگان
41 آموزش جاوا (Java) قسمت 41 : معرفی داده ساختارها Enumeration رایگان
42 آموزش جاوا (Java) قسمت 42 : داده ساختار BitSet رایگان
43 آموزش جاوا (Java) قسمت 43 : داده ساختار Vector رایگان
44 آموزش جاوا (Java) قسمت 44 : داده ساختار Stack (پشته) رایگان
45 آموزش جاوا (Java) قسمت 45 : داده ساختار Dictionary رایگان
46 آموزش جاوا (Java) قسمت 46 : داده ساختار Hashtable رایگان
47 آموزش جاوا (Java) قسمت 47 : داده ساختار Properites رایگان
48 آموزش جاوا (Java) قسمت 48 : معرفی و آموزش جنریک (Generic) رایگان
49 آموزش جاوا (Java) قسمت 49 : برنامه نویسی سوکت و شبکه قسمت 1 رایگان
50 آموزش جاوا (Java) قسمت 50 : برنامه نویسی سوکت و شبکه قسمت 2 رایگان
51 آموزش جاوا (Java) قسمت 51 : استفاده از Lambda Expression رایگان
52 آموزش جاوا (Java) قسمت 52 : Thread و Multi-Threading رایگان
53 آموزش جاوا (Java) قسمت 53 : Runnable در Thread و Multi-Threading رایگان
54 آموزش جاوا (Java) قسمت 54 : کلاس Thread و متدها رایگان
زمان و قیمت کل 0″ 0
0 نظر

هیچ نظری ارسال نشده است! اولین نظر برای این مطلب را شما ارسال کنید...

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره پاییزه می تونی امروز ارزونتر از فردا خرید کنی ....