জাভা 7 ট্রাই-উইথ রিসোর্স সিনট্যাক্স (এআরএম ব্লক ( অটোমেটিক রিসোর্স ম্যানেজমেন্ট ) নামেও পরিচিত ) একমাত্র AutoCloseableসংস্থান ব্যবহার করার সময় খুব সুন্দর, সংক্ষিপ্ত এবং সোজা । তবে, আমি যখন একে অপরের উপর নির্ভরশীল একাধিক সংস্থান যেমন, উদাহরণস্বরূপ ক FileWriterএবং এটি একটি BufferedWriterজড়িয়ে রাখে এমন ঘোষণার দরকার হয় তখন সঠিক আইডিয়ামটি কী তা নিশ্চিত । অবশ্যই, এই প্রশ্নটি যে কোনও ক্ষেত্রেই উদ্বিগ্ন যখন কিছু AutoCloseableসংস্থানগুলি মোড়ানো হয়, কেবল এই দুটি নির্দিষ্ট শ্রেণি নয়।
আমি নিম্নলিখিত তিনটি বিকল্প নিয়ে এসেছি:
1)
আমি যে নির্ভুল প্রতিমাটি দেখেছি তা হ'ল এআরএম-পরিচালিত ভেরিয়েবলের মধ্যে কেবলমাত্র শীর্ষ-স্তরের মোড়ক ঘোষনা করা:
static void printToFile1(String text, File file) {
try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) {
bw.write(text);
} catch (IOException ex) {
// handle ex
}
}
এটি সুন্দর এবং সংক্ষিপ্ত, তবে এটি ভেঙে গেছে। অন্তর্নিহিত FileWriterকোনও পরিবর্তনশীল হিসাবে ঘোষিত না হওয়ায় এটি কখনই উত্পন্ন finallyব্লকে সরাসরি বন্ধ হবে না । এটি কেবল closeমোড়ানোর পদ্ধতি দ্বারা বন্ধ করা হবে BufferedWriter। সমস্যাটি হ'ল, যদি bwএর নির্মাণকারীর থেকে কোনও ব্যতিক্রম ছুঁড়ে ফেলা হয় , তবে এটি কল করা closeহবে না এবং তাই অন্তর্নিহিত FileWriter বন্ধ করা হবে না ।
2)
static void printToFile2(String text, File file) {
try (FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw)) {
bw.write(text);
} catch (IOException ex) {
// handle ex
}
}
এখানে, অন্তর্নিহিত এবং মোড়ানোর উভয় সংস্থানটি এআরএম-পরিচালিত ভেরিয়েবলগুলিতে ঘোষণা করা হয়েছে, সুতরাং উভয় অবশ্যই বন্ধ হয়ে যাবে, তবে অন্তর্নিহিত fw.close() দু'বার বলা হবে : কেবল সরাসরি নয়, তবে মোড়কের মাধ্যমেও bw.close()।
এই দুটি নির্দিষ্ট শ্রেণীর ক্ষেত্রে সমস্যা হওয়া উচিত নয় যা উভয়ই প্রয়োগ করে Closeable(যা একটি উপপ্রকার AutoCloseable), যার চুক্তিতে বলা হয়েছে যে একাধিক কল করার closeঅনুমতি দেওয়া হয়েছে:
এই স্ট্রিমটি বন্ধ করে এবং এর সাথে যুক্ত যেকোনও সিস্টেম সংস্থান প্রকাশ করে। যদি স্ট্রিমটি ইতিমধ্যে বন্ধ হয়ে যায় তবে এই পদ্ধতিটি আহ্বানের কোনও প্রভাব নেই।
তবে, সাধারণ ক্ষেত্রে আমার কাছে এমন সংস্থান থাকতে পারে যা কেবলমাত্র প্রয়োগ করে AutoCloseable(এবং না Closeable), যা গ্যারান্টি দেয় না যে closeএকাধিকবার বলা যেতে পারে:
নোট করুন যে java.io.Cseseable এর ঘনিষ্ঠ পদ্ধতির বিপরীতে, এই ঘনিষ্ঠ পদ্ধতিটি আদর্শবান হওয়ার প্রয়োজন নেই। অন্য কথায়, এই ঘনিষ্ঠ পদ্ধতিকে একাধিকবার কল করা কিছুটা দৃশ্যমান পার্শ্ব প্রতিক্রিয়া হতে পারে, Cloableable.close এর বিপরীতে যা একাধিকবার ডাকা হলেও কোনও প্রভাব ফেলতে হবে না। যাইহোক, এই ইন্টারফেসের প্রয়োগকারীরা তাদের ঘনিষ্ঠ পদ্ধতিগুলিকে আদর্শবান করতে দৃ strongly়ভাবে উত্সাহিত করা হয়।
3)
static void printToFile3(String text, File file) {
try (FileWriter fw = new FileWriter(file)) {
BufferedWriter bw = new BufferedWriter(fw);
bw.write(text);
} catch (IOException ex) {
// handle ex
}
}
এই সংস্করণটি তাত্ত্বিকভাবে সঠিক হওয়া উচিত, কারণ কেবল এমন fwএকটি বাস্তব সংস্থান উপস্থাপন করে যা পরিষ্কার করা দরকার needs bwকোনো সম্পদ এটি শুধুমাত্র প্রতিনিধিদের রাখা নিজেই নয়, fw, তাই এটি শুধুমাত্র ঘনিষ্ঠ অন্তর্নিহিত করার জন্য যথেষ্ট হওয়া উচিত fw।
অন্যদিকে, সিনট্যাক্সটি কিছুটা অনিয়মিত এবং এছাড়াও, গ্রিপস একটি সতর্কতা জারি করে, যা আমি বিশ্বাস করি যে এটি একটি মিথ্যা বিপদাশঙ্কা, তবে এটি এখনও একটি সতর্কতা যা একটিকে মোকাবেলা করতে হবে:
রিসোর্স লিক: 'বিডব্লু' কখনই বন্ধ হয় না
সুতরাং, কোন পদ্ধতির জন্য যেতে? বা আমি অন্য কোনও প্রতিমাটি মিস করেছি যা সঠিক ?
public BufferedWriter(Writer out, int sz)একটি নিক্ষেপ করতে পারেন IllegalArgumentException। এছাড়াও, আমি বাফারড্রাইটারকে এমন ক্লাসের সাথে প্রসারিত করতে পারি যা এর নির্মাতার কাছ থেকে কিছু নিক্ষেপ করতে পারে বা যা প্রয়োজন তা পছন্দ করে একটি কাস্টম মোড়ক তৈরি করতে পারে।
BufferedWriterকন্সট্রাকটর সহজে একটি ব্যতিক্রম নিক্ষেপ করতে পারেন। OutOfMemoryErrorএটি সম্ভবত সবচেয়ে সাধারণ কারণ এটি বাফারের জন্য মেমরির ন্যায্য অংশকে বরাদ্দ করে (যদিও এটি আপনাকে পুরো প্রক্রিয়াটি পুনরায় আরম্ভ করতে চাইবে)। / আপনি যদি আপনার বিষয়বস্তুগুলি বন্ধ না করেন এবং রাখতে চান তবে flushআপনার প্রয়োজন BufferedWriter(সাধারণত কেবলমাত্র ব্যতিক্রমী ক্ষেত্রে নয়)। FileWriter"ডিফল্ট" ফাইল এনকোডিং হিসাবে যা ঘটবে তা তুলে ধরে - স্পষ্ট করে বলা ভাল।