আপনি বহিরাগত সর্বাধিক স্ট্রিমটি বন্ধ করতে পারেন, বাস্তবে আপনার জড়িত সমস্ত স্ট্রিম ধরে রাখতে হবে না এবং আপনি জাভা use টি ব্যবহার করে রিসোর্স ব্যবহার করতে পারেন।
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new GZIPOutputStream(new FileOutputStream(createdFile)))) {
// write to the buffered writer
}
আপনি যদি YAGNI, বা আপনি-এটি-দরকার-এর সাবস্ক্রাইব করে থাকেন তবে আপনার কেবলমাত্র প্রয়োজন কোডটি যুক্ত করা উচিত actually আপনার প্রয়োজন হতে পারে এমন কল্পনাটি কোড যুক্ত করা উচিত নয় তবে বাস্তবে কার্যকর কোনও কাজ করে না।
এই উদাহরণটি ধরুন এবং কল্পনা করুন যে আপনি যদি এটি না করেন এবং সম্ভবত প্রভাব কী হতে পারে তবে কী ভুল হতে পারে?
try (
OutputStream outputStream = new FileOutputStream(createdFile);
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outputStream);
OutputStreamWriter osw = new OutputStreamWriter(gzipOutputStream);
BufferedWriter bw = new BufferedWriter(osw)
) {
// ...
}
ফাইলআউটপুট স্ট্রিম দিয়ে শুরু করা যাক যা open
সমস্ত আসল কাজ করতে কল করে।
/**
* Opens a file, with the specified name, for overwriting or appending.
* @param name name of file to be opened
* @param append whether the file is to be opened in append mode
*/
private native void open(String name, boolean append)
throws FileNotFoundException;
যদি ফাইলটি খুঁজে পাওয়া যায় না, তবে বন্ধ করার কোনও অন্তর্নিহিত সংস্থান নেই, সুতরাং এটি বন্ধ করে কোনও তাত্পর্য তৈরি করবে না। যদি ফাইলটি বিদ্যমান থাকে তবে এটি ফাইলনটফাউন্ডএক্সসেপশন নিক্ষেপ করা উচিত। সুতরাং একা এই লাইন থেকে সংস্থানটি বন্ধ করার চেষ্টা করে লাভ করার কিছু নেই।
আপনার ফাইলটি বন্ধ করার কারণটি হ'ল ফাইলটি সফলভাবে খোলা থাকলেও পরে আপনি একটি ত্রুটি পান।
পরের স্ট্রিমটি দেখতে দিন GZIPOutputStream
এমন একটি কোড রয়েছে যা ব্যতিক্রম করতে পারে
private void writeHeader() throws IOException {
out.write(new byte[] {
(byte) GZIP_MAGIC, // Magic number (short)
(byte)(GZIP_MAGIC >> 8), // Magic number (short)
Deflater.DEFLATED, // Compression method (CM)
0, // Flags (FLG)
0, // Modification time MTIME (int)
0, // Modification time MTIME (int)
0, // Modification time MTIME (int)
0, // Modification time MTIME (int)
0, // Extra flags (XFLG)
0 // Operating system (OS)
});
}
এটি ফাইলের শিরোনামটি লিখেছেন। এখন আপনার পক্ষে লেখার জন্য কোনও ফাইল খোলার পক্ষে এটি খুব অসাধারণ হবে তবে এটিতে 8 বাইট এমনকি লিখতেও সক্ষম হবেন না, তবে কল্পনা করুন যে এটি ঘটতে পারে এবং আমরা পরে ফাইলটি বন্ধ করি না। ফাইলটি বন্ধ না হলে কী হবে?
আপনি কোনও অপ্রকাশিত লেখাগুলি পান না, সেগুলি বাতিল করে দেওয়া হয় এবং এই ক্ষেত্রে স্ট্রিমের কাছে কোনও সফলভাবে লিখিত বাইট নেই যা এই মুহুর্তে বাফার হয় না। তবে যে ফাইলটি বন্ধ নেই তা চিরকালের জন্য বাঁচে না, পরিবর্তে ফাইলআউটপুট স্ট্রিম রয়েছে
protected void finalize() throws IOException {
if (fd != null) {
if (fd == FileDescriptor.out || fd == FileDescriptor.err) {
flush();
} else {
/* if fd is shared, the references in FileDescriptor
* will ensure that finalizer is only called when
* safe to do so. All references using the fd have
* become unreachable. We can call close()
*/
close();
}
}
}
আপনি যদি কোনও ফাইল বন্ধ না করেন তবে এটি তাত্ক্ষণিকভাবেই বন্ধ হয়ে যায় (এবং আমি যেমন বলেছি, বাফারে থাকা ডেটা এইভাবে হারিয়ে যাবে, তবে এই মুহুর্তে কিছুই নেই)
অবিলম্বে ফাইলটি বন্ধ না করার পরিণতি কী? সাধারণ পরিস্থিতিতে, আপনি সম্ভাব্যভাবে কিছু ডেটা হারাবেন এবং আপনার সম্ভাব্য ফাইল বিবরণীর বাইরে চলে যায়। তবে আপনার যদি এমন একটি সিস্টেম থাকে যেখানে আপনি ফাইল তৈরি করতে পারেন তবে আপনি সেগুলিতে কিছুই লিখতে পারবেন না, আপনার একটি বড় সমস্যা রয়েছে। যেমন আপনি ব্যর্থ হচ্ছেন সত্ত্বেও কেন আপনি বারবার এই ফাইলটি তৈরি করার চেষ্টা করছেন তা কল্পনা করা শক্ত।
উভয় আউটপুট স্ট্রিমাইটার এবং বাফারড রাইটারই তাদের নির্মাতাদের মধ্যে আইওএক্সেপশন নিক্ষেপ করে না, সুতরাং তারা কী সমস্যা করবে তা পরিষ্কার নয়। বাফারড্রিটারের ক্ষেত্রে আপনি একটি আউটআফমিউরিওর পেতে পারেন। এই ক্ষেত্রে এটি অবিলম্বে একটি জিসিকে ট্রিগার করবে, যা আমরা দেখেছি যেভাবেই ফাইলটি বন্ধ হয়ে যাবে।