در جلسه سی ام به برخی از کلاس های خواندن و نوشتن در زمینه کار با فایل در جاوا پرداختیم. اما خب کار با فایل به همین کلاس ها ختم نمیشود و همان طور که از قبل گفتیم مبحث کار با فایل خیلی گسترده است که ما سعی میکنیم مفاهیم پرکاربردی که بیشتر نیاز بهشون داریم رو کار کنیم.
نکته: برای این که آموزش ها خسته کننده و گیج کننده نشود تکه تکه مفاهیم و کلاس های کار فایل را در جلسات مجزا بررسی میکنیم.
InputStreamReader
کلاس InputStreamReader نیز برای خواندن داده های یک فایل استفاده میشود.
کلاس InputStreamReader پلی از جریان بایت ها به جریان کاراکترهاست. این کلاس داده های بایتی رو میخونه ،برامون این بایت ها را بصورت مجموعه ای از کاراکترها رمزگشایی میکنه و در نهایت ما میتوانیم از این مجموعه ای از کاراکترها استفاده کنیم.
برای استفاده از کلاس InputStreamReader باید پکیج java.io.InputStreamReader را درسورس کد برنامه مون import کنیم.
import java.io.InputStreamReader ; |
✔ پس درکل برای خواندن مجموعه ای از کاراکتر ها از کلاس InputStreamReader استفاده میکنیم.
این کلاس نیز دارای چندین سازنده است که با توجه به نیاز آنها را هنگام شی سازی صدا میزنیم:
InputStreamReader(InputStream in) |
✔ یکی از سازنده های این کلاس بصورت پیشفرض برای استفاده از مجموعه ای کاراکترها است.
✔ همون طور که مشاهده میکنید این سازنده به عنوان پارامتر یک شی از کلاس InputStream دریافت میکند.از آنجایی که کلاس FileInputStream فرزند کلاس InputStream هستش این سازنده میتواند یک شی از نوع FileInputStream را نیز دریافت کند.
برخی از متدهای کلاس InputStreamReader را در زیر بررسی کرده ایم:
void close () |
✔ این متد برای بستن فایلی است که از طریق کلاس InputStreamReader خوانده شده است.
مثال:
package www.javapro.ir; |
خروجی: یک استثنا رخ میدهد و دستور درون بلوک catch اجرا میشود،دلیل رخ دادن استثنا این هست که از طریق شی ساخته شده از کلاس InputStreamReader با نام isr متد read صدا زده شده است.و این در حالی است که در خط قبل از آن شی isr که حاوی آدرس فایل خوانده شده از کامپیوتر است با متد close بسته شده است و دیگر نمیتوانیم به داده های درون آن دسرسی پیدا کنیم. (چیزی شبیه یک فایل txt در notepad زمانی میتوانید که داده های یک فایل تکس را ببینید که آن فایل را باز کرده باشید )
خروجی در محیط کنسول بصورت زیر است:
close() invoked The stream is already closed |
توضیحات:
FileInputStream fis = null; InputStreamReader isr = null; |
✔ از دو کلاس FileInputStream و InputStreamReader بدون صدا زدن سازنده آنها شی ایجاد کرده ایم و مقدار null بهشون نسبت داده ایم. نکته ای که باید به ان توجه کنید این است که به همراه کلاس InputStreamReader حتما باید کلاس FileInputStream هم تعریف کنید چون ورودی پارامتر سازنده کلاس InputStreamReader از نوع کلاس InputStream است.
int i; char c; |
✔ تعریف دو متغیر، برای داده های بایتی یک متغیر از نوع int و برای داده های کاراکتری یک متغیر از نوع char ایجاد کرده ایم.
try { // new input stream reader is create d fis = new FileInputStream("test.txt"); isr = new InputStreamReader(fis); |
✔ برای کنترل استثنا از بلوک try-catch استفاده شده است.
✔ خب سازنده های دو کلاس را برای اشیا صدا میزنیم.
✔ آدرس فایلی که از قبل درون کامپیوتر ما و در پوشه پروژه ای که این سورس کد درونش قرار دارد را به عنوان پارامتر به سازنده کلاس FileInputStream داده ایم.
✔ شی fis که از نوع کلاس FileInputStream هستش را به عنوان پارامتر به سازنده کلاس InputStreamReader داده ایم.
isr.close(); |
✔ شی isr که حاوی جریان فایل ورودی ما است را با این متد بسته ایم.با این کار دیگر فایلی که از کامپیوتر خواندیم بسته شده و دیگر به ان دسرسی نداریم
i = isr.read(); c = (char) i; System.out.print ln(c); |
✔ قصد داشتیم یک بایت را از فایل بخوانیم و با تبدیل بایت خوانده شده به کاراکتر آن را چاپ کنیم که با استثنا روبرو میشویم-زیرا شی isr که حاوی جریان فایل خوانده شده است که در خط با متد close بسته شده است.
} catch (Exception e) { // print error System.out. print ("The stream is already closed"); } finally { // closes the stream and releases resources associated if (fis != null) fis.close(); if (isr != null) isr.close(); } |
✔ به دلیل رخ دادن استثنا دستور درون بلوک catch اجرا میشود و در نهایت صرف نظر از این که چه اتفاقی در برنامه رخ میدهد دستورات درون بلوک finally اجرا میشود و درصورت null نبودن فایل ها همه ی آنها بسته میشود.
int read() |
💡 این متد تک به تک کاراکترهای موجود در فایل را میخواند.
مثال :در کامپیوتر پوشه پروژمون یک فایل با نام و فرمت name.txt داریم که حاوی تعدادی اسم به صورت متن (رشته) یا مجموعه ای از کاراکتر ها است بصورت زیر: (تصویر 1) حالا قصد داریم با استفاده از کلاس های FileInputStream و InputStreamReader این فایل را کاراکتر به کاراکتر بخوانیم و در محیط کنسول آنها را چاپ کنیم:
package fileIO; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class InputStreamReaderDemo { public static void main(String[] args) throws IOException { FileInputStream fis = null; InputStreamReader isr =null; char c; int i; try { // new input stream reader is create d fis = new FileInputStream("name.txt"); isr = new InputStreamReader(fis); // read till the end of the file while((i=isr.read())!=-1) { // int to character c=(char)i; // print char System.out. print ln("Character Read: "+c); } } catch (Exception e) { // print error e. print StackTrace(); } finally { // closes the stream and releases resources associated if(fis!=null) fis.close(); if(isr!=null) isr.close(); } } } |
در دوره پیشرفته برنامه نویسی جاوا به صورت ویدئویی به موضوع فایل ها در جاواپرداخته ایم. |
خروجی:
Character Read: A Character Read: l Character Read: i Character Read: Character Read: R Character Read: e Character Read: z Character Read: a Character Read: Character Read: h Character Read: a Character Read: s Character Read: a Character Read: n Character Read: Character Read: j Character Read: a Character Read: f Character Read: a Character Read: r Character Read: |
✔ همان طور که گفتیم ما کاراکتر به کاراکتر فایل را میخوانیم، حالا اینجا هم میبینید که با هر بار خوانده شده کاراکترهای درون فایل مقادیر آنها در محیط کنسول چاپ شده است.مثلا نام اول ما ali بود که بصورت
a l i |
خوانده شده و بعد از آن فاصله یا اسپیس را به عنوان یک کاراکتر خوانده است و غیره.
نکته جدید نداره فقط به خط کد زیر نگاه کنید:
c=(char)i; |
✔ در اینجا ما مقدار متغیر از نوع بایت را به متغیر از نوع کاراکتر تبدیل ساخته ایم و درون یک متغیر از نوع کاراکتر ریخته ایم. به این کار عمل casting در جاوا میگوییم خود بحث جدایی است واردش نمیشویم فقط این ذهنیت را داشته باشد اگر خواستید یک متغیر را به متغیر دیگر تبدیل کنیم میتوانیم با قرار دادن نوع متغیر درون پرانتز و گذاشتن پرانتز سمت چپ متغیر هدف که سمت راست مساوی قرار دارد آن را تبدیل یا به اصلاح casting میکنیم.
c=(char)i; |
✔ i متغیر هدف ما که سمت راست علامت مساوی قرار دارد.در اینجا متغیر i از نوع int است.
✔ نوع متغیری که قصد داریم متغیر هدف را به ان تبدیل کنیم درون پرانتر قرار میدهیم. (char)
حال پرانتز را سمت چپ متغیر هدف قرار میدهیم.
(char)i |
در نهایت سمت چپ علامت مساوی متغیری که از نوعی که درون پرانتز وجود دارد را قرار میدهیم.
c=(char)i; |
✔ در اینجا متغیر c از نوع char است.
نکته : همه متغیر ها رو نمیشود به روش casting به هم تبدیل کرد.
String b="100000000"; int a=(int)b; |
مثلا همچین cast ای رو نمیشه انجام داد در جلسه ای جدا به این مفهوم میپردازیم ،بگذریم فراموشش کنید بریم سراغ اصل مطلب!!!
مثال بالا را بصورت زیر تغییر میدهیم:
***ادامه این جلسه آموزشی را به صورت کامل و مرتب شده در زیر دانلود کنید:
بستن *نام و نام خانوادگی * پست الکترونیک * متن پیام |
دوره های آموزشی برنامه نویسی
انجام پروژه های برنامه نویسی
تدریس خصوصی برنامه نویسی
بیش از 7 سال از فعالیت جاواپرو میگذرد
جاواپرو دارای مجوز نشر دیجیتال از وزارت فرهنگ و ارشاد اسلامی است
جهت ارتباط مستقیم با جاواپرو در واتساپ و تلگرام :
09301904690