"হাই! আজকের পাঠে, আমরা জাভাতে ইনপুট এবং আউটপুট স্ট্রীম সম্পর্কে আমাদের কথোপকথন চালিয়ে যাব ( Java I/O )। এটি এই বিষয়ে প্রথম পাঠ নয়, এবং এটি অবশ্যই শেষ হবে না :) যেমন এটি ঘটছে, জাভা ভাষা I/O-এর সাথে কাজ করার অনেক উপায় প্রদান করে। এই কার্যকারিতা বাস্তবায়নকারী বেশ কয়েকটি ক্লাস রয়েছে, তাই আমরা সেগুলিকে কয়েকটি পাঠে বিভক্ত করেছি — যাতে আপনি শুরু থেকেই বিভ্রান্ত হবেন না :) অতীতে পাঠ, আমরা স্পর্শ করেছি
BufferedReader
, সেইসাথে InputStream
এবং OutputStream
বিমূর্ত শ্রেণী এবং বেশ কয়েকটি বংশধর। আজ আমরা 3টি নতুন শ্রেণী বিবেচনা করব: FileInputStream
, FileOutputStream
, এবং BufferedInputStream
.
ফাইলআউটপুট স্ট্রিম ক্লাস
ক্লাসের মূল উদ্দেশ্যFileOutputStream
হল একটি ফাইলে বাইট লেখা। জটিল কিছুই নেই :) বিমূর্ত শ্রেণীর FileOutputStream
বাস্তবায়নের একটি OutputStream
। কনস্ট্রাক্টরে, এই ক্লাসের অবজেক্টগুলি হয় টার্গেট ফাইলের পাথ (যেখানে বাইট লেখা উচিত) বা একটি File
অবজেক্ট নেয়। আমরা প্রতিটি উদাহরণ পরীক্ষা করব:
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("C:\\Users\\Username\\Desktop\\test.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file);
String greetings = "Hi! Welcome to CodeGym — The best site for would-be programmers!";
fileOutputStream.write(greetings.getBytes());
fileOutputStream.close();
}
}
অবজেক্ট তৈরি করার সময় File
, আমরা কনস্ট্রাক্টরের কাছে কাঙ্খিত পথটি পাস করেছি। আমাদের এটি আগে থেকে তৈরি করার দরকার নেই: যদি এটি বিদ্যমান না থাকে তবে প্রোগ্রামটি এটি তৈরি করবে। আপনি একটি অতিরিক্ত বস্তু তৈরি না করেও পেতে পারেন, কেবল পাথের সাথে একটি স্ট্রিং পাস করে:
public class Main {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Username\\Desktop\\test.txt");
String greetings = "Hi! Welcome to CodeGym — The best site for would-be programmers!";
fileOutputStream.write(greetings.getBytes());
fileOutputStream.close();
}
}
উভয় ক্ষেত্রেই ফলাফল একই হবে। আমরা আমাদের ফাইলটি খুলতে পারি এবং সেখানে নিম্নলিখিতগুলি দেখতে পারি:
Hi! Welcome to CodeGym — The best site for would-be programmers!
কিন্তু এখানে একটি nuance আছে. উপরের উদাহরণ থেকে একটি সারিতে বেশ কয়েকবার কোড চালানোর চেষ্টা করুন। তারপর ফাইলটি দেখুন এবং এই প্রশ্নের উত্তর দিন: এতে কতগুলি লাইন আছে? শুধু একটি. কিন্তু আপনি কোডটি বেশ কয়েকবার চালিয়েছেন। দেখা যাচ্ছে যে ডেটা প্রতিবার ওভাররাইট করা হয় - পুরানোটি নতুন দ্বারা প্রতিস্থাপিত হয়। আমরা কি করব যদি এটি আমাদের উপযুক্ত না হয় এবং আমাদের ফাইলে ক্রমানুসারে লিখতে হয়? আমরা যদি একটি ফাইলে পরপর তিনবার আমাদের শুভেচ্ছা লিখতে চাই? এটা সব খুব সহজ. যেহেতু ভাষা জানতে পারে না যে প্রতিটি ক্ষেত্রে আমাদের কী আচরণ প্রয়োজন, FileOutputStream
কনট্রুকিউটর একটি অতিরিক্ত প্যারামিটার নিতে পারে —boolean append
. যদি এর মান সত্য হয়, ডেটা ফাইলের শেষে লেখা হবে। যদি এটি মিথ্যা হয় (এবং ডিফল্টরূপে এটি মিথ্যা), কোনো পুরানো ডেটা মুছে ফেলা হবে এবং নতুন ডেটা দ্বারা প্রতিস্থাপিত হবে। আসুন আমাদের পরিবর্তিত কোডটি তিনবার চালিয়ে এটি পরীক্ষা করি:
public class Main {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Username\\Desktop\\test.txt", true);
String greetings = "Hi! Welcome to CodeGym — The best site for would-be programmers!\r\n";
fileOutputStream.write(greetings.getBytes());
fileOutputStream.close();
}
}
ফাইলের বিষয়বস্তু:
Hi! Welcome to CodeGym — The best site for would-be programmers!
Hi! Welcome to CodeGym — The best site for would-be programmers!
Hi! Welcome to CodeGym — The best site for would-be programmers!
এখন সেটা আলাদা! I/O ক্লাস ব্যবহার করার সময় এই বৈশিষ্ট্যটি সম্পর্কে ভুলবেন না। একটা সময় ছিল যখন আমি কাজের জন্য ঘন্টার পর ঘন্টা ব্যয় করতাম, ঘন্টার পর ঘন্টা আমার মস্তিস্ক র্যাক করতাম, কিভাবে আমার ডেটা ফাইল থেকে অদৃশ্য হয়ে যাচ্ছে তা বোঝার চেষ্টা করতাম :) এবং অবশ্যই, অন্যান্য I/O ক্লাসের মতো, পদ্ধতিটি ব্যবহার করতে ভুলবেন close()
না বিনামূল্যে সম্পদ.
FileInputStream ক্লাস
এরFileInputStream
বিপরীত উদ্দেশ্য রয়েছে - একটি ফাইল থেকে বাইট পড়া। যেমন FileOutputStream
উত্তরাধিকারসূত্রে , এই শ্রেণীটি বিমূর্ত শ্রেণী OutputStream
থেকে উদ্ভূত । আমরা আমাদের " test.txtInputStream
" ফাইলে কয়েকটি লাইন লিখব :
"So close no matter how far
Couldn't be much more from the heart
Forever trusting who we are
And nothing else matters"
এটি ব্যবহার করে একটি ফাইল থেকে ডেটা পড়তে কেমন লাগে তা এখানে FileInputStream
:
public class Main {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\test.txt");
int i;
while((i=fileInputStream.read())!= -1){
System.out.print((char)i);
}
}
}
আমরা ফাইল থেকে একটি বাইট পড়ি, পঠিত বাইটগুলিকে অক্ষরে রূপান্তর করি এবং কনসোলে প্রদর্শন করি। এবং এখানে কনসোল আউটপুট:
So close no matter how far
Couldn't be much more from the heart
Forever trusting who we are
And nothing else matters
BufferedInputStream ক্লাস
আমি মনে করি, অতীতের পাঠ থেকে জ্ঞান দেওয়া হলে, আপনি সহজেই বলতে পারেন কেন আমাদের ক্লাসটি প্রয়োজনBufferedInputStream
এবং এটির তুলনায় এটির কী সুবিধা রয়েছে FileInputStream
:) আমরা ইতিমধ্যে বাফারযুক্ত স্ট্রিমগুলির সম্মুখীন হয়েছি, তাই আপনি পড়া চালিয়ে যাওয়ার আগে অনুমান করার (বা মনে রাখার) চেষ্টা করুন :) প্রধানত I/O অপ্টিমাইজ করার জন্য বাফার করা স্ট্রিমগুলির প্রয়োজন৷ একটি ডেটা উত্স অ্যাক্সেস করা, যেমন একটি ফাইল থেকে পড়া, কার্যক্ষমতার দিক থেকে একটি ব্যয়বহুল অপারেশন এবং প্রতিটি বাইট পড়ার জন্য একটি ফাইল অ্যাক্সেস করা অপচয়। এই কারণেই BufferedInputStream
ডেটা একবারে একটি বাইট নয়, কিন্তু ব্লকগুলিতে পড়ে এবং অস্থায়ীভাবে একটি বিশেষ বাফারে সংরক্ষণ করে। এটি আমাদের ফাইলটি অ্যাক্সেস করার সংখ্যা কমিয়ে প্রোগ্রামটিকে অপ্টিমাইজ করতে দেয়। দেখা যাক এটি কেমন দেখাচ্ছে:
public class Main {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\test.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream, 200);
int i;
while((i = bufferedInputStream.read())!= -1){
System.out.print((char)i);
}
}
}
এখানে আমরা একটি BufferedInputStream
বস্তু তৈরি করেছি। InputStream
এর কনস্ট্রাক্টর ক্লাস বা তার বংশধরদের একটি উদাহরণ নেয় , তাই FileInputStream
করবে। একটি অতিরিক্ত যুক্তি হিসাবে, এটি বাইটে বাফার আকার নেয়। এই যুক্তির জন্য ধন্যবাদ, ডেটা এখন ফাইল থেকে একবারে এক বাইট নয়, একবারে 200 বাইট পড়া হবে! কল্পনা করুন যে আমরা ফাইল অ্যাক্সেসের সংখ্যা কতটা কমিয়েছি। FileInputStream
কর্মক্ষমতা তুলনা করতে, আপনি একটি বড় টেক্সট ফাইল (কয়েকটি মেগাবাইট পাঠ্য) নিতে পারেন এবং এটি ব্যবহার করে কনসোলে পড়তে এবং আউটপুট করতে মিলিসেকেন্ডে কতক্ষণ লাগে তা তুলনা করতে পারেন BufferedInputStream
। এখানে কোড যা উভয় বিকল্প প্রদর্শন করে:
public class Main {
public static void main(String[] args) throws IOException {
Date date = new Date();
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\textBook.rtf");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
int i;
while((i = bufferedInputStream.read())!= -1){
System.out.print((char)i);
}
Date date1 = new Date();
System.out.println((date1.getTime() - date.getTime()));
}
}
public class Main {
public static void main(String[] args) throws IOException {
Date date = new Date();
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\26951280.rtf");
int i;
while((i = fileInputStream.read())!= -1){
System.out.print((char)i);
}
Date date1 = new Date();
System.out.println((date1.getTime() - date.getTime()));
}
}
আমার কম্পিউটারে একটি 1.5 MB ফাইল পড়ার সময়, FileInputStream
কাজটি ~ 3500 মিলিসেকেন্ডে সম্পন্ন করে, কিন্তু BufferedInputStream
1700 মিলিসেকেন্ডে এটি পরিচালনা করে। আপনি দেখতে পাচ্ছেন, বাফার করা স্ট্রিমটি কাজটিকে অপ্টিমাইজ করেছে, এটিকে অর্ধেক করে দিয়েছে! :) আমরা I/O ক্লাস অধ্যয়ন চালিয়ে যাব — শীঘ্রই দেখা হবে!
GO TO FULL VERSION