بررسی PrintWriter
با استفاده از PrintWriter در جاوا و کاتلین میتونیم داده ها رو به صورت متن در فایل بنویسیم.
همانطور که گفتیم کلاس File در جاوا از خوندن و نوشتن داخل فایل پشتیبانی نمیکنه و برای این کار باید از کلاس های دیگه در پکیج io استفاده کنیم.
یکی از این کلاس ها PrintWriter در جاوا است؛ کلاس PrintWriter برای نوشتن متن در فایل مورد استفاده قرار میگیره.
تا الان برای نوشتن خروجی در کنسول از قطعه کد زیر استفاده میکردید:
System.out.println(...)
فیلد استاتیک out در واقع از نوع PrintStream است در کلاس PrintStream متدهای print، println و printf تعریف شده.
همین متد ها برای کلاس PrintWriter نیز تعریف شده و با استفاده از این متد ها در PrintWriter میتونیم داده ها رو به صورت متن در فایل بنویسیم.
در زیر کانستراکتور و متد های پرکاربرد کلاس PrintWriter بیان شده.
در کلاس هایی که مختص خوندن و نوشتن در جاوا هستند،checked-exception انداخته شده و هنگام تعریفشون باید در بلوک try-catch قرار بگیرند.
راهنمایی
برای اکثر کلاس های io کافیه IOException رو به عنوان پارامتر بلوک catch تعریف کنیم.
مثال
در مثال زیر ابتدا برنامه بررسی میکنه فایل وجود داره یا خیر اگه وجود داشته باشه برنامه متوقف میشه. سپس اگه فایل وجود نداشته باشه فایل به صورت خودکار توسط PrintWriter در روت پروژه (بخاطر مسیری که تعریف کردیم) ایجاد میشه و سپس داده ها رو داخل فایل می نویسه و بعد از پایان کار با متد close فایل رو میبنده.
با هر بار باز کردن فایل توسط PrintWriter، محتوای فایل پاک شده و محتوای جدید در فایل نوشته میشه؛ یکی از روش های جلوگیری از پاک شدن محتوای فایل هنگام باز شدن توسط PrintWriter استفاده از FileWriter به عنوان پارامتر PrintWriter است که در بخش آخر توضیح داده شده است.
فکر خوبیه برای بستن فایل، متد close رو داخل بدنه ی finally صدا بزنیم. اگر چه میتونیم داخل بدنه ی try متد close رو صدا بزنیم اما با صدا زدنش در finally مطمئن میشیم بعدش متدی برای خوندن و نوشتن صدا نزدیم.
معرفی try-with-resources
استفاده از try-with-resources در جاوا اجباری نیست اما برای مرتب تر شدن کد ها و جلو گیری از فراموش کردن صدا زدن متد close توصیه میشه.
گاهی اوقات برنامه نویسا فراموش میکنن متد close رو صدا بزنن برای همین از جاوا 7 به بعد try-with-resources معرفی شد با استفاده از try-with-resources کلاس هایی که از AutoClosable ارث بری میکنن به طور خودکار بدون نیاز به صدا زدن متد close بسته میشن.
توجه
کلاس Scanner در جاوا نیز از AutoClosable ارث میبره.
فرم کلی:
اگه بخوایم از PrintWriter با try-with-resources استفاده کنیم مثل زیر میشه:
در کاتلین به جای try-with-resources از تابع خطی use استفاده میکنیم.
مثال
در مثال زیر از try-with-resources در جاوا و تابع use در کاتلین استفاده کردیم.
نوشتن داده ها در امتداد محتوای فایل
به طور پیشفرض هنگام باز کردن فایل توسط PrintWriter محتوای فایل پاک شده و فایل برای نوشتن محتوای جدید مورد استفاده قرار میگیره.
با کمک FileWriter میتونیم داده های از پیش ذخیره شده در فایل رو حفظ کرده و داده های جدید رو در ادامه ی داده های قبلی بنویسیم.
برای این کار باید مقدار پارامتر appendable کانستراکتور FileWriter رو true قرار بدیم و خود FileWriter رو به عنوان پارامتر به PrintWriter پاس بدیم.
توجه
کلاس FileWriter یکی از کلاس های Output در جاوا است و مانند PrintWriter میتونیم مستقیم از متد های خودش استفاده کنیم.
خلاصه
- کلاس PrintWriter در جاوا برای نوشتن داده های متنی در فایل است.
- بعد از انجام عملیات خوندن و نوشتن باید با استفاده از متد close فایل رو ببندیم.
- با try-with-resources در جاوا کلاس هایی که از AutoClosable ارث بری میکنن بدون نیاز به صدا زدن متد close به طور خودکار در آخر کار بسته میشن.
- در کاتلین بجای try-with-resources از تابع use استفاده میکنیم.
- با کمک آبجکت FileWriter و true قرار دادن مقدار پارامتر appendable آن میتونیم از پاک شدن محتوای فایل هنگام باز شدن توسط PrintWriter جلوگیری کنیم.