ফাইল আই/ও (File I/O)
ফাইল আই/ও কেন প্রয়োজন? (Why File I/O?)
এতক্ষণ পর্যন্ত, আপনার প্রোগ্রামের কাজ শেষ হওয়ার সাথে সাথে এর সমস্ত ডেটাও মুছে যাচ্ছিল — অনেকটা হোয়াইটবোর্ডে লিখে আবার সেটি মুছে ফেলার মতো। ফাইল আই/ও বা File I/O (ইনপুট/আউটপুট বা Input/Output) আপনাকে এই ডেটাগুলো ফাইলে সংরক্ষণ করার এবং পরে আবার তা পড়ে দেখার সুযোগ করে দেয়। এটি হোয়াইটবোর্ডের বদলে একটি খাতায় লিখে রাখার মতোই ব্যাপার।
ফাইল নিয়ে কাজ করার জন্য জাভা আপনাকে বেশ কিছু টুলস বা সরঞ্জাম দেয়:
- File — এটি মূলত কোনো ফাইল বা ডিরেক্টরির পাথকে (path) প্রকাশ করে। এটি নিজে থেকে সরাসরি কোনো কিছু পড়ে না বা লেখে না, বরং ফাইলের অবস্থানটি নির্দেশ করে।
- Scanner — এটি ফাইল থেকে টেক্সট বা লেখা পড়ে (আপনি তো ইতিমধ্যেই ইউজারের কাছ থেকে ইনপুট নেওয়ার ব্যাপারে এর সাথে পরিচিত!)।
- FileWriter / PrintWriter — ফাইলগুলোতে টেক্সট লেখার কাজ করে।
- BufferedReader — অত্যন্ত দক্ষতার সাথে লাইন বাই লাইন ফাইলগুলো থেকে ডেটা পড়ে থাকে।
সবচেয়ে জরুরি নিয়মটি হলো: কাজ শেষ হওয়ার পর সব সময় আপনার ফাইলগুলোকে বন্ধ করে দেবেন (close your files)। এর চেয়েও ভালো হয় যদি আপনি try-with-resources ব্যবহার করেন, কারণ তাহলে জাভা নিজেই আপনার হয়ে সেগুলো বন্ধ করে দেবে।
ফাইলে লেখা (Writing to a File)
ফাইল থেকে ডেটা পড়া (Reading Files)
ফাইল পড়া অনেকটা বই পড়ার মতোই — আপনি চাইলে লাইন ধরে ধরে, শব্দ মিলিয়ে মিলিয়ে অথবা চোখের পলকে পুরোটা একসাথে পড়ে ফেলতে পারেন। এর মধ্যে সবচেয়ে পরিচিত উপায়গুলো হলো:
- Scanner — এটি বেশ সহজ এবং পরিচিত একটি পদ্ধতি। ছোট আকারের ফাইল এবং ভিন্ন ভিন্ন ধরনের ডেটা পার্স (parsing) করার ক্ষেত্রে এটি খুব কাজে আসে।
- BufferedReader — বড় ফাইলগুলোর ক্ষেত্রে এটি অনেক বেশি কার্যকর বা দক্ষ। এটি এক এক করে অক্ষর বা ক্যারেক্টার পড়ার বদলে একসাথে অনেকগুলো ডেটার ব্লক বা চাঙ্ক (chunk) মেমোরির একটি বাফারে (buffer) লোড করে (ঠিক যেমন একসাথে একটি অক্ষরের দিকে না তাকিয়ে অনেকগুলো পৃষ্ঠা মাথায় লোড করে নেওয়া)।
খুব ভালোভাবে ফাইল বন্ধ হওয়া নিশ্চিত করতে এই দুটির সাথেই try-with-resources ব্যবহার করা উচিত, এমনকি যদি মাঝপথে কোনো এরর বা ত্রুটিও দেখা দেয়।