View Full Version : سوال: درخواست توضیح در مورد بستن فایل ها
Sina.iRoid
یک شنبه 02 آذر 1393, 10:07 صبح
سلام به همه دوستان عزیز.
امکانش هست که در مورد علت بستن فایل ها یه توضیح مختصر و مفیدی و بدین!؟ و اینکه اگر یه فایلی و close() نکنیم ممکنه چه اتفاقی بیفته!؟
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestMainClass {
public static void main(String[] args) throws IOException{
String source = "Hi, i'm \"Sina\" and now i want to use"
+ " \"FileOutputStream\" in Java programming.";
byte[] buf = source.getBytes();
FileOutputStream outputStream1 = new FileOutputStream(
"F:"+File.separator+"11.Directory"+File.separator+"file1.txt");
outputStream1.write(buf);
outputStream1.close();
}
}
ممنون اگر راهنماییم کنید :بوس:
محمد فدوی
یک شنبه 02 آذر 1393, 16:47 عصر
سلام.
بطور معمول در جاوا قرار بر اینه که هر شیء قابل بستن (مثل انواع استریم ها, کانکشن ها و...) هر وقت داشت از بین میرفت و مدیر سطل آشغال جاوا میخواست حذفش کنه (همون Dispose یا Finalize) بطور خودکار اون شیء close هم بشه. اما خب این وسط خیلی اتفاقا ممکنه بیفته که باعث بشه این کار رخ نده.
اگه یه استریم فایل باز بمونه, اولا منابع سیستمی تخصیص داده شده برای باز کردن این استریم از بین نمیره و حافظه الکی هدر میره و ثانیا دسترسی به اون فایل دیگه به روش های معمول امکان پذیر نیست چون یه فایل در آن واحد میتونه یه استریم داشته باشه.
واسه همین موارده که تاکید میشه حتی الامکان این اشیاء بصورت دستی close بشن و از بسته شدنشون مطمین بشیم.
پ.ن:
از Java 7 به بعد میتونی در این موارد از ساختار Try-with-Resources (http://www.mkyong.com/java/try-with-resources-example-in-jdk-7/) استفاده کنی که در اونصورت جاوا مطمینا خودش اون شیء رو close میکنه و خیلی وقتا از پیچیدگی کار برنامه نویس خیلی کم میشه.
اضافه کردن عبارت throws به یه تابع به جهت اینکه از چک کردن استثناءها خلاص بشیم کار درستی نیست و علاوه بر اتفاقات عجیبی که ممکنه پیش بیاره به شدت Debug رو سخت میکنه.
ahmad.mo74
یک شنبه 02 آذر 1393, 16:59 عصر
سلام، بستن stream ها بعد از اتمام کارمون به این دلیله که اولا منابعی که برای stream استفاده شده بود آزاد بشه، دوم اینکه مثلا وقتی از File Stream استفاده میکنیم با بستن stream فایل آزاد بشه و اجازه استفاده از اون فایل به دیگران هم داده بشه.
بستن InputStream ها خوبه ولی در مورد OutputStream ها باید حواسمون باشه قبل از بستن stream متد flush رو کال کنیم چون ممکنه بافر از دست بره، یعنی :
FileOutputStream fileOutputStream = new FileOutputStream(file);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
writer.write("...");
writer.flush();
writer.close();
fileOutputStream.close();
از jdk 7 به بعد هم که کار با try with resources راحت تر هم شده و حتی دیگه نیازی به flush کردن هم نیست :
try (FileOutputStream fileOutputStream = new FileOutputStream("path");
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fileOutputStream))) {
writer.write("...");
}
ahmad.mo74
یک شنبه 02 آذر 1393, 17:02 عصر
من داشتم مینوشتم کسی جواب نداده بود الان رفرش کردم دیدم آقای فدوی جواب دادن، ماشاالله سرعت بالاس :))
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.