কম্পিউটার টিউটোরিয়াল

রুবিতে ইনপুট ও আউটপুট (IO) মাস্টার করুন: একটি কম্প্রিহেনসিভ গাইড

I/O মানে Input/Output।

ইনপুট বলতে কিছুতে (কম্পিউটার, রুবি মেথড, আপনার ব্রেইন) ঢুকা সকল ডেটা ও ইনফরমেশন বোঝায়।

ইনপুটের উদাহরণ:

  • কীবোর্ডে আপনি যে কীগুলো চাপেন
  • মাউস ক্লিক
  • আপনি যে বইগুলো পড়েন

আউটপুট বলতে ইনপুটের ফলস্বরূপ বের হওয়া সব কিছু বোঝায়।

আউটপুটের উদাহরণ:

  • ১ + ১-এর ফলাফল
  • একটি আর্টিকেল পড়ে সারমর্ম লেখা
  • কফি

রুবিতে, আমরা যখন i/o এর কথা বলি, সাধারণত ফাইল পড়া, নেটওয়ার্ক সকেটের সাথে কাজ করা এবং স্ক্রিনে ইনফরমেশন প্রিন্ট করার কথা বোঝায়।

IO ক্লাস বুঝতে

IO রুবিতে একটি ক্লাসও।

এটি File এবং Socket-এর মতো অন্যান্য অবজেক্টের প্যারেন্ট ক্লাস।

সকল IO অবজেক্টের এই অপারেশনগুলো থাকে:

  • open / close
  • read
  • write

IO অবজেক্টগুলো ফাইল ডেসক্রিপ্টর-এর ওপর ভিত্তি করে তৈরি।

আপনার কম্পিউটারে চলমান প্রতিটি প্রসেসের একটি ইন্টারনাল ইনফরমেশন টেবিল থাকে।

এই টেবিলের অংশ হিসেবে ফাইল ডেসক্রিপ্টরের একটি লিস্ট থাকে।

একটি ফাইল ডেসক্রিপ্টর হলো একটি ইন্টিজার এবং একটি ফাইল নামের মাঝপথে ম্যাপিং।

আপনি লিনাক্সে এই ফাইল ডেসক্রিপ্টর লিস্টটি দেখতে পারেন।

এই কমান্ড দিয়ে:

 # Assuming you have irb open on another window ls -lh /proc/`pgrep irb`/fd/ # lrwx------ 1 jesus jesus 64 Feb 3 15:54 0 -> /dev/pts/3 # lrwx------ 1 jesus jesus 64 Feb 3 15:54 1 -> /dev/pts/3 # lrwx------ 1 jesus jesus 64 Feb 3 15:54 2 -> /dev/pts/3 

আপনি রুবিতে sysopen মেথড দিয়ে একটি নতুন ফাইল ডেসক্রিপ্টর তৈরি করতে পারেন।

উদাহরণ:

 fd = IO.sysopen('/dev/null', 'w') # 10 

এখন আপনি এই ফাইল ডেসক্রিপ্টর (10) এর সাথে একটি কমিউনিকেশন চ্যানেল খুলতে পারেন।

এভাবে:

 io = IO.new(fd) 

এবং এতে লিখতে পারেন:

 io << 'orange' 

লক্ষ্য করুন IO কে এই話 নয় যে আপনার ফাইল ডেসক্রিপ্টর একটি একচুয়া ফাইল, একটি ডিভাইস (যেমন হার্ড ডিস্ক), অথবা একটি নেটওয়ার্ক সকেটের সাথে ম্যাপ করা।

লেখার জন্য ফাইল ডেসক্রিপ্টর কীভাবে খুলবেন

যখন আপনি sysopen ব্যবহার করে একটি নতুন ফাইল ডেসক্রিপ্টর তৈরি করেন, বা File.open ব্যবহার করে একটি ফাইল খোলেন, আপনার কয়েকটি অপশন থাকে।

ডিফল্টলি কমিউনিকেশন রিড-অনলি।

আপনি একটি মোড স্পেসিফাই করতে পারেন:

  • r (রিড, ডিফল্ট)
  • w (রাইট)
  • w+ (রিড এবং রাইট)
  • a (অ্যাপেন্ড)

উদাহরণ:

 fd = IO.sysopen('/dev/tty1', 'w+') 

এটি /dev/tty1-কে রিড + রাইট মোডে খোলে।

৩টি স্ট্যান্ডার্ড IO স্ট্রিম

আপনি যখন একটি নতুন প্রোগ্রাম খুলেন (আপনার এডিটর, টার্মিনাল, রুবি ইন্টারপ্রেটার, ইত্যাদি) এটি ডিফল্টলি ৩টি কমিউনিকেশন চ্যানেল খোলে।

৩টি ফাইল ডেসক্রিপ্টর।

সেগুলো হলো:

  • stdin (ইনপুট)
  • stdout (আউটপুট)
  • stderr (এরর)

রুবিতে আপনি এইগুলো সরাসরি অ্যাক্সেস করতে পারেন, তাদের কনস্ট্যান্ট ফর্ম বা গ্লোবাল ভেরিয়েবল ফর্ম ব্যবহার করে।

উদাহরণ:

 $stdout << "abc\n" 

আপনি $stdout-এ লিখলে, এটি puts মেথড কল করার সমান।

স্ট্যান্ডার্ড আউটপুট আপনার টার্মিনালের সাথে জড়িত।

 lrwx------ 1 jesus jesus 64 Feb 3 15:54 0 -> /dev/pts/3 

এই /dev/pts/3 হলো একটি ভার্চুয়াল ডিভাইস যা আপনার টার্মিনাল পড়ে স্ক্রিনে টেক্সট ডিসপ্লে করে।

স্ট্যান্ডার্ড এরর আউটপুটের জন্যও ব্যবহৃত হয়, কিন্তু এটি আপনার টার্মিনালকে এই কন্টেন্টটি আলাদা ভাবে উপস্থাপন করার সুযোগ দেয়, যেন বড় ফন্টে, বা রেগুলার টেক্সট থেকে আলাদা রঙে।

আপনি warn মেথড ব্যবহার করে স্ট্যান্ডার্ড এররে প্রিন্ট করতে পারেন।

স্ট্যান্ডার্ড ইনপুট হলো যেখানে ইউজার ইনপুট পড়া হয়।

আপনি gets মেথড ব্যবহার করে স্ট্যান্ডার্ড ইনপুট থেকে পড়তে পারেন।

STDOUT ফ্লাশ করা এবং বাফারিং ডিজেবল করা

IO অবজেক্টগুলোর একটি ইন্টারনাল বাফার থাকে।

এক নির্দিষ্ট পরিমাণ ইনপুট ডেটা সংরক্ষণ হয় তার আগে যাতে তা পড়া যায়।

সেই কারণে কখনো কখনো আপনি puts ব্যবহার করেন... কিন্তু আপনি কিছু দেখতে পান না প্রোগ্রাম শেষ হওয়া পর্যন্ত, বা বাফার ফুল হওয়া পর্যন্ত!

আপনি বাফারিং ডিজেবল করতে পারেন এভাবে:

 $stdout.sync = true 

বা আপনি ম্যানুয়ালি বাফার ফ্লাশ করতে পারেন:

 $stdout.flush 

বাফার ডিজেবল থাকলে আপনি আউটপুট দেখতে পাবেন অপেক্ষা ছাড়া।

চানকে পড়া

যখন আপনি একটি IO অবজেক্ট থেকে পড়ছেন, আপনি read করেন যতক্ষণ না স্ট্রিমটি END-OF-FILE (EOF) সিগন্যাল দিয়ে শেষ হয়, স্ট্রিম বন্ধ হয়, বা আপনি একটি নির্দিষ্ট পরিমাণ বাইট পান।

নেটওয়ার্ক প্রোগ্রামিং এবং বড় ফাইলের জন্য, ছোট ছোট চানকে পড়া হেল্পফুল।

আপনি চানকে এভাবে পড়তে পারেন:

 data = "" until io.eof? data << io.read(2048) end 

এই কোড দিয়ে আপনি ডেটা প্রসেস করতে পারেন যতক্ষণে তা উপলব্ধ হয়, পুরো ডাউনলোড শেষ হওয়ার জন্য অপেক্ষা ছাড়া।

লক্ষ্য করুন eof? "ব্লক" করবে।

ব্লকিং মানে আপনার কোড ঘুমিয়ে যাবে যতক্ষণ না অপারেটিং সিস্টেম সিগন্যাল দেয় যে নতুন ডেটা পড়ার জন্য আছে।

টু-ওয়ে কমিউনিকেশনের জন্য IO পাইপ কীভাবে ব্যবহার করবেন

রুবি আপনাকে পাইপ তৈরি করতে দেয়।

একটি পাইপ হলো ফাইল ডেসক্রিপ্টরের একটি জোড়া যা একে অপরের সাথে কানেক্টেড।

এটি ইন্টার-প্রসেস কমিউনিকেশন (IPC) এর জন্য ব্যবহৃত হয়।

উদাহরণ:

 read, write = IO.pipe 

আপনি এটি fork মেথড (উইন্ডোজে উপলব্ধ নয়) এর সাথে ব্যবহার করতে পারেন বর্তমান প্রসেসের একটি কপি তৈরি করতে।

এই দুটি প্রসেস পাইপ ব্যবহার করে কমিউনিকেট করতে পারে।

উদাহরণ:

 if fork write.close puts "Message received: #{read.gets}" read.close else read.close write << "Buy some bananas!" write.close end 

ফলাফল:

 # Message received: Buy some bananas! 

কার্নেল Open মেথড কীভাবে ব্যবহার করবেন

রুবিতে একটি খুব ফ্লেক্সিবল open মেথড রয়েছে।

এটি আপনাকে ফাইল খুলতে দেয় এবং URL থেকে ডেটা পড়তে দেয়, এমনকি এক্সটার্নাল কমান্ড রান করার জন্য পাইপ খুলতে দেয়।

উদাহরণ:

 open "abc.txt" 

সেই কারণেই এই মেথড এড়াতে হয়।

এটি সকল কাজ করতে পারে সেটি একটি সিকিউরিটি রিস্ক।

বদলে, আপনার প্রয়োজনীয় নির্দিষ্ট open মেথড ব্যবহার করা ভালো।

উদাহরণ:

 File.open # File IO.popen # Process open URI.parse(...).open # URL open 

এই সবই একটি IO অবজেক্ট রিটার্ন করে।

সারসংক্ষেপ

আপনি রুবিতে ইনপুট/আউটপুট সম্পর্কে শিখেছেন! আপনি ফাইল ডেসক্রিপ্টর, IO ক্লাস, বাফারিং, চানকে পড়া এবং স্ট্যান্ডার্ড IO স্ট্রিম সম্পর্কে শিখেছেন।

রুবিতে ইনপুট ও আউটপুট (IO) মাস্টার করুন: একটি কম্প্রিহেনসিভ গাইড

আপনি যদি এই আর্টিকেল পছন্দ করেন তবে শেয়ার করতে ভুলবেন না।

পড়ার জন্য ধন্যবাদ।


  1. রুবি অন রেলসে এনভায়রনমেন্ট ভেরিয়েবল মাস্টার করুন: একটি সম্পূর্ণ গাইড

  2. টাইম কমপ্লেক্সিটি আয়ত্ত করুন: রুবি ডেভেলপারদের জন্য ব্যাপক গাইড

  3. রুবিতে ফাংশনাল প্রোগ্রামিং আয়ত্ত করুন: একটি সম্পূর্ণ গাইড

  4. রুবির Enumerable মডিউল মাস্টার করুন: একটি ব্যবহারিক গাইড + আমার প্রিয় মেথড