"আমিগো, দশ কুঁড়েঘর!"

"আমি জাভা শিখতে পেরে খুশি, ক্যাপ্টেন!"

"নিশ্চিন্তে, অ্যামিগো। আজকে আমাদের কাছে একটি অতি আকর্ষণীয় বিষয় রয়েছে। একটি জাভা প্রোগ্রাম কিভাবে বাহ্যিক সংস্থানগুলির সাথে যোগাযোগ করে সে সম্পর্কে আমরা কথা বলব এবং আমরা একটি খুব আকর্ষণীয় জাভা বিবৃতি অধ্যয়ন করব। আপনার কান না ঢেকে রাখা ভাল।"

"আমি উত্কর্ণ."

"যেহেতু একটি জাভা প্রোগ্রাম চলে, কখনও কখনও এটি জাভা মেশিনের বাইরের সত্তাগুলির সাথে যোগাযোগ করে৷ উদাহরণস্বরূপ, ডিস্কে থাকা ফাইলগুলির সাথে৷ এই সংস্থাগুলিকে সাধারণত বহিরাগত সংস্থান বলা হয়৷"

"তাহলে অভ্যন্তরীণ সম্পদ কি বিবেচনা করা হয়?"

"অভ্যন্তরীণ সম্পদ হল জাভা মেশিনের ভিতরে তৈরি করা বস্তু। সাধারণত, মিথস্ক্রিয়া এই স্কিমটি অনুসরণ করে:

সম্পদের বিবৃতি দিয়ে চেষ্টা করুন

"অপারেটিং সিস্টেম কঠোরভাবে উপলব্ধ সংস্থানগুলির ট্র্যাক রাখে , এবং বিভিন্ন প্রোগ্রাম থেকে সেগুলির ভাগ করা অ্যাক্সেসও নিয়ন্ত্রণ করে৷ উদাহরণস্বরূপ, যদি একটি প্রোগ্রাম একটি ফাইল পরিবর্তন করে, তাহলে অন্য একটি প্রোগ্রাম সেই ফাইলটিকে পরিবর্তন করতে (বা মুছে ফেলতে) পারে না৷ এই নীতিটি নয়৷ ফাইলের মধ্যে সীমাবদ্ধ, কিন্তু তারা সবচেয়ে সহজে বোধগম্য উদাহরণ প্রদান করে।

"অপারেটিং সিস্টেমের ফাংশন (এপিআই) রয়েছে যা একটি প্রোগ্রামকে সংস্থানগুলি অর্জন এবং/অথবা প্রকাশ করতে দেয়৷ যদি কোনও সংস্থান ব্যস্ত থাকে, তবে কেবলমাত্র যে প্রোগ্রামটি এটি অর্জন করেছে সেগুলিই এটির সাথে কাজ করতে পারে৷ যদি একটি সংস্থান বিনামূল্যে হয় তবে যে কোনও প্রোগ্রাম অর্জন করতে পারে৷ এটা

"মনে করুন যে একটি অফিস কফির মগ শেয়ার করেছে। কেউ যদি একটি মগ নেয়, তাহলে অন্যরা তা আর নিতে পারবে না। কিন্তু একবার মগটি ব্যবহার করে, ধুয়ে তার জায়গায় রেখে দিলে, যে কেউ আবার নিতে পারবে।"

"বুঝলাম। এটা সাবওয়ে বা অন্যান্য পাবলিক ট্রান্সপোর্টের সিটের মতো। যদি একটি সিট খালি থাকে, তবে যে কেউ তা নিতে পারে। যদি একটি সিট দখল করা হয়, তাহলে এটি যে ব্যক্তি নিয়েছে তার দ্বারা নিয়ন্ত্রিত হয়।"

"এটা ঠিক। এবং এখন বাহ্যিক সংস্থান অর্জনের বিষয়ে কথা বলা যাক। আপনার জাভা প্রোগ্রাম যখনই ডিস্কে একটি ফাইল নিয়ে কাজ করা শুরু করে, তখন জাভা মেশিন অপারেটিং সিস্টেমকে এটিতে একচেটিয়া অ্যাক্সেসের জন্য জিজ্ঞাসা করে। যদি সংস্থানটি বিনামূল্যে হয়, তাহলে জাভা মেশিন অধিগ্রহণ করে। এটা

"কিন্তু আপনি ফাইলটির সাথে কাজ শেষ করার পরে, এই সংস্থানটি (ফাইল) অবশ্যই প্রকাশ করতে হবে, অর্থাৎ আপনাকে অপারেটিং সিস্টেমকে অবহিত করতে হবে যে আপনার আর এটির প্রয়োজন নেই৷ আপনি যদি এটি না করেন তবে সংস্থানটি চলতে থাকবে ৷ আপনার প্রোগ্রাম দ্বারা অনুষ্ঠিত হয়।"

"এটা ন্যায্য শোনাচ্ছে।"

"এটিকে এভাবে রাখতে, অপারেটিং সিস্টেম প্রতিটি চলমান প্রোগ্রাম দ্বারা দখলকৃত সংস্থানগুলির একটি তালিকা বজায় রাখে৷ যদি আপনার প্রোগ্রামটি নির্ধারিত সংস্থান সীমা অতিক্রম করে, তাহলে অপারেটিং সিস্টেম আপনাকে আর নতুন সংস্থান দেবে না৷

"এটি এমন প্রোগ্রামের মতো যা সমস্ত স্মৃতি খেয়ে ফেলতে পারে ..."

"এমন কিছু। ভাল খবর হল যে আপনার প্রোগ্রামটি বন্ধ হয়ে গেলে, সমস্ত সংস্থান স্বয়ংক্রিয়ভাবে প্রকাশিত হবে (অপারেটিং সিস্টেম নিজেই এটি করে)।"

"যদি এটি সুসংবাদ হয়, তার মানে কি খারাপ খবর আছে?"

"অবশ্যই তাই। খারাপ খবর হল যে আপনি যদি একটি সার্ভার অ্যাপ্লিকেশন লিখছেন..."

"কিন্তু আমি কি এই ধরনের অ্যাপ্লিকেশন লিখি?"

"জাভাতে প্রচুর সার্ভার অ্যাপ্লিকেশন লেখা হয়, তাই সম্ভবত আপনি সেগুলি কাজের জন্য লিখবেন। যেমনটি আমি বলছিলাম, আপনি যদি একটি সার্ভার অ্যাপ্লিকেশন লিখছেন, তবে আপনার সার্ভারকে দিন, সপ্তাহ, মাস ধরে অবিরাম চলতে হবে, ইত্যাদি।"

"অন্য কথায়, প্রোগ্রামটি শেষ হয় না, এবং এর অর্থ মেমরিটি স্বয়ংক্রিয়ভাবে প্রকাশিত হয় না।"

"ঠিক আছে। এবং যদি আপনি দিনে 100টি ফাইল খোলেন এবং সেগুলি বন্ধ না করেন, তাহলে কয়েক সপ্তাহের মধ্যে আপনার অ্যাপ্লিকেশনটি তার রিসোর্স লিমিটে পৌঁছে যাবে এবং ক্র্যাশ হয়ে যাবে।"

"এটি স্থিতিশীল কাজের মাসের অনেক কম পড়ে যাচ্ছে! কী করা যায়?"

"যে শ্রেণীগুলি বাহ্যিক সংস্থানগুলি ব্যবহার করে তাদের মুক্তির জন্য একটি বিশেষ পদ্ধতি রয়েছে: close().

"এখানে একটি প্রোগ্রামের একটি উদাহরণ যা একটি ফাইলে কিছু লিখে এবং তারপর ফাইলটি শেষ হয়ে গেলে সেটি বন্ধ করে দেয়, অর্থাৎ এটি অপারেটিং সিস্টেমের সংস্থানগুলিকে মুক্ত করে৷ এটি মোটামুটি এইরকম দেখায়:

কোড বিঃদ্রঃ
String path = "c:\\projects\\log.txt";
FileOutputStream output = new FileOutputStream(path);
output.write(1);
output.close();
ফাইলের পথ।
ফাইল অবজেক্ট পান: সম্পদ অর্জন করুন।
ফাইলটিতে লিখুন
ফাইলটি বন্ধ করুন - সংস্থানটি ছেড়ে দিন

"আহ... সুতরাং, একটি ফাইল (বা অন্যান্য বাহ্যিক সংস্থান) নিয়ে কাজ করার পরে, আমাকে close()বাহ্যিক সম্পদের সাথে লিঙ্কযুক্ত বস্তুর পদ্ধতিটি কল করতে হবে।"

"হ্যাঁ। সবকিছুই সহজ বলে মনে হচ্ছে। কিন্তু প্রোগ্রাম চলার সাথে সাথে ব্যতিক্রম ঘটতে পারে, এবং বাহ্যিক সম্পদ প্রকাশ করা হবে না।"

"আর এটা খুব খারাপ। কি করব?"

"পদ্ধতিটি সর্বদা কল করা হয় তা নিশ্চিত করার জন্য close(), আমাদের কোডটি একটি try- catch- finallyব্লকে মুড়ে দিতে হবে এবং close()ব্লকে পদ্ধতিটি যুক্ত করতে হবে finally। এটি দেখতে এরকম কিছু হবে:

try
{
   FileOutputStream output = new FileOutputStream(path);
   output.write(1);
   output.close();
}
catch (IOException e)
{
   e.printStackTrace();
}
finally
{
   output.close();
}

"হুম... এখানে কিছু ভুল হয়েছে?"

"ঠিক আছে। এই কোডটি কম্পাইল করবে না, কারণ outputভেরিয়েবলটি ব্লকের ভিতরে ঘোষণা করা হয়েছে try{}, এবং তাই ব্লকে দৃশ্যমান নয় finally

আসুন এটি ঠিক করা যাক:

FileOutputStream output = new FileOutputStream(path);

try
{
   output.write(1);
   output.close();
}
catch (IOException e)
{
   e.printStackTrace();
}
finally
{
   output.close();
}

"এখন সব ঠিক আছে?"

"এটা ঠিক আছে, কিন্তু আমরা অবজেক্ট তৈরি করার সময় কোনো ত্রুটি ঘটলে এটি কাজ করবে না FileOutputStreamএবং এটি খুব সহজেই ঘটতে পারে।

আসুন এটি ঠিক করা যাক:

FileOutputStream output = null;

try
{
   output = new FileOutputStream(path);
   output.write(1);
   output.close();
}
catch (IOException e)
{
   e.printStackTrace();
}
finally
{
   output.close();
}

"এবং এখন সবকিছু কাজ করে?"

"এখনও কিছু সমালোচনা আছে। প্রথমত, অবজেক্ট তৈরি করার সময় যদি কোনো ত্রুটি দেখা দেয় FileOutputStream, তাহলে outputভেরিয়েবলটি নাল হয়ে যাবে। এই সম্ভাবনাটিকে অবশ্যই ব্লকে বিবেচনা করতে হবে finally

"দ্বিতীয়, close()পদ্ধতিটি সর্বদা ব্লকে বলা হয় finally, যার অর্থ ব্লকে এটি প্রয়োজনীয় নয় try। চূড়ান্ত কোডটি এইরকম দেখাবে:

FileOutputStream output = null;

try
{
   output = new FileOutputStream(path);
   output.write(1);
}
catch (IOException e)
{
   e.printStackTrace();
}
finally
{
   if (output!=null)
      output.close();
}

"এমনকি যদি আমরা ব্লকটি বিবেচনা না করি catch, যা বাদ দেওয়া যেতে পারে, তাহলে আমাদের কোডের 3 লাইন 10 হয়ে যায়। কিন্তু আমরা মূলত ফাইলটি খুলেছিলাম এবং 1 লিখেছিলাম।"

"উফ... এটা একটা ভালো জিনিস যেটা ব্যাপারটা শেষ করেছে। তুলনামূলকভাবে বোধগম্য, কিন্তু কিছুটা ক্লান্তিকর, তাই না?"

"তাই তাই। তাই জাভার নির্মাতারা কিছু সিনট্যাকটিক চিনি যোগ করে আমাদের সাহায্য করেছেন। এখন আসুন প্রোগ্রামের হাইলাইটে যাওয়া যাক, বা বরং, এই পাঠে:

try-সম্পদ সহ

"এর 7 তম সংস্করণ দিয়ে শুরু করে, জাভা একটি নতুন try-সম্পদের সাথে বিবৃতি দিয়েছে৷

"এটি পদ্ধতিতে বাধ্যতামূলক কল দিয়ে সমস্যার সমাধান করার জন্য অবিকল তৈরি করা হয়েছিল close()।"

"এটা প্রতিশ্রুতিশীল শোনাচ্ছে!"

"সাধারণ কেসটি বেশ সহজ দেখায়:

try (ClassName name = new ClassName())
{
   Code that works with the name variable
}

"তাহলে এই বিবৃতি অন্য ভিন্নতা try ? "

"হ্যাঁ। আপনাকে কীওয়ার্ডের পরে বন্ধনী যুক্ত করতে হবে try, এবং তারপর বন্ধনীর ভিতরে বাহ্যিক সংস্থান দিয়ে বস্তু তৈরি করতে হবে। বন্ধনীর প্রতিটি বস্তুর জন্য, কম্পাইলার finallyপদ্ধতিতে একটি বিভাগ এবং একটি কল যোগ করে close()

"নীচে দুটি সমতুল্য উদাহরণ রয়েছে:

দীর্ঘ কোড সম্পদের সাথে চেষ্টা করে দেখুন
FileOutputStream output = null;

try
{
   output = new FileOutputStream(path);
   output.write(1);
}
finally
{
   if (output!=null)
   output.close();
}
try(FileOutputStream output = new FileOutputStream(path))
{
   output.write(1);
}

"দুর্দান্ত! রিসোর্স-সহ ব্যবহার করা কোডটি tryঅনেক ছোট এবং সহজে পড়া যায়। এবং আমাদের যত কম কোড থাকবে, টাইপো বা অন্য ত্রুটি হওয়ার সম্ভাবনা তত কম।"

"আমি আনন্দিত যে আপনি এটি পছন্দ করেছেন। যাইহোক, আমরা -সাথে-সম্পদ বিবৃতিতে যোগ catchএবং finallyব্লক করতে পারি try। অথবা প্রয়োজন না হলে আপনি সেগুলি যোগ করতে পারবেন না।

একই সময়ে বেশ কয়েকটি ভেরিয়েবল

"আপনি প্রায়শই এমন পরিস্থিতির সম্মুখীন হতে পারেন যখন আপনাকে একই সময়ে একাধিক ফাইল খুলতে হবে৷ ধরা যাক আপনি একটি ফাইল অনুলিপি করছেন, তাই আপনার দুটি বস্তুর প্রয়োজন: যে ফাইল থেকে আপনি ডেটা অনুলিপি করছেন এবং যে ফাইলটিতে আপনি ডেটা অনুলিপি করছেন .

"এই ক্ষেত্রে, try-with-resources স্টেটমেন্ট আপনাকে এটিতে একটি কিন্তু বেশ কয়েকটি অবজেক্ট তৈরি করতে দেয়। যে কোডটি অবজেক্ট তৈরি করে সেটি অবশ্যই সেমিকোলন দ্বারা আলাদা করা উচিত। এখানে এই স্টেটমেন্টের সাধারণ চেহারা:

try (ClassName name = new ClassName(); ClassName2 name2 = new ClassName2())
{
   Code that works with the name and name2 variables
}

ফাইল কপি করার উদাহরণ:

শর্ট কোড দীর্ঘ কোড
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileInputStream input = new FileInputStream(src);

FileOutputStream output = new FileOutputStream(dest))
{
   byte[] buffer = input.readAllBytes();
   output.write(buffer);
}
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

FileInputStream input = null;
FileOutputStream output = null;

try
{
   input = new FileInputStream(src);
   output = new FileOutputStream(dest);

   byte[] buffer = input.readAllBytes();
   output.write(buffer);
}
finally
{
   if (input!=null)
      input.close();
   if (output!=null)
      output.close();
}

"আচ্ছা, আমরা এখানে কি বলতে পারি? try-সম্পদের সাথে একটি চমৎকার জিনিস!"

"আমরা যা বলতে পারি তা হল আমাদের এটি ব্যবহার করা উচিত।"