CodeGym /Java Blog /এলোমেলো /BuffreredReader এবং InputStreamReader ক্লাসের সাথে কাজ কর...
John Squirrels
লেভেল 41
San Francisco

BuffreredReader এবং InputStreamReader ক্লাসের সাথে কাজ করার অনুশীলন করুন

এলোমেলো দলে প্রকাশিত
ওহে! আজকের পাঠকে সুবিধার জন্য দুই ভাগে ভাগ করা হবে। আমরা কিছু পুরানো বিষয়ের পুনরাবৃত্তি করব যা আমরা আগে স্পর্শ করেছি, এবং আমরা কিছু নতুন বৈশিষ্ট্য বিবেচনা করব :) প্রথমটি দিয়ে শুরু করা যাক। আপনি ইতিমধ্যে অনেক বার মত একটি ক্লাস করেছি BufferedReader. আমি আশা করি আপনি এই বিবৃতিটি ভুলে যাওয়ার সময় পাননি:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
আরও পড়ার আগে, প্রতিটি উপাদান — System.in, InputStreamReader, BufferedReader— কীসের জন্য দায়ী এবং কেন এটি প্রয়োজন তা মনে করার চেষ্টা করুন। মনে আছে? যদি না হয়, কোন চিন্তা নেই. :) আপনি যদি কিছু ভুলে গিয়ে থাকেন তবে এই পাঠটি পুনরায় পড়ুন , যা পাঠক শ্রেণীর জন্য উত্সর্গীকৃত। আমরা সংক্ষেপে তাদের প্রত্যেকে কি করতে পারে তা স্মরণ করব। System.in— এটি কীবোর্ড থেকে ডেটা গ্রহণের জন্য একটি স্ট্রীম।  নীতিগতভাবে, পাঠ্য পড়ার জন্য প্রয়োজনীয় যুক্তি বাস্তবায়নের জন্য এটি একাই যথেষ্ট। কিন্তু, আপনি যেমন মনে করবেন, System.inশুধুমাত্র বাইট পড়তে পারেন, অক্ষর নয়:

public class Main {

   public static void main(String[] args) throws IOException { 

       while (true) { 
           int x = System.in.read(); 
           System.out.println(x); 
       } 
   } 
} 
যদি আমরা এই কোডটি কার্যকর করি এবং সিরিলিক অক্ষর "Й" লিখি, আউটপুট হবে:

Й
208
153
10 
সিরিলিক অক্ষর মেমরিতে 2 বাইট দখল করে এবং সেগুলি স্ক্রিনে প্রদর্শিত হয়। 10 নম্বর হল একটি লাইন ফিড অক্ষরের দশমিক প্রতিনিধিত্ব, অর্থাৎ এন্টার টিপে। বাইট পড়া যেমন একটি আনন্দ, তাই ব্যবহার করা System.inখুব সুবিধাজনক নয়। সিরিলিক (এবং অন্যান্য) অক্ষর সঠিকভাবে পড়ার জন্য, আমরা InputStreamReaderএকটি মোড়ক হিসাবে ব্যবহার করি:

public class Main { 

   public static void main(String[] args) throws IOException { 

       InputStreamReader reader = new InputStreamReader(System.in); 
       while (true) { 
           int x = reader.read(); 
           System.out.println(x); 
       } 
   } 
} 
আমরা একই অক্ষর "Й" লিখি, কিন্তু ফলাফল এবার ভিন্ন:

Й 
1049 
10
InputStreamReaderদুটি বাইট (208 এবং 153) একক সংখ্যা 1049-এ রূপান্তরিত করা হয়েছে। এটি অক্ষর পড়ার অর্থ। 1049 সিরিলিক অক্ষর "Й" এর সাথে মিলে যায়। আমরা সহজেই নিজেদেরকে বোঝাতে পারি যে এটি সত্য:

public class Main { 

   public static void main(String[] args) throws IOException { 
       char x = 1049; 
       System.out.println(x); 
   } 
} 
কনসোল আউটপুট:

Й
এবং forBufferedReader(এবং সাধারণভাবে, BufferedAnythingYouWant) হিসাবে, বাফার করা ক্লাসগুলি কর্মক্ষমতা অপ্টিমাইজ করতে ব্যবহৃত হয়। একটি ডেটা উৎস (ফাইল, কনসোল, ওয়েব রিসোর্স) অ্যাক্সেস করা কার্যক্ষমতার দিক থেকে বেশ ব্যয়বহুল। অতএব, অ্যাক্সেসের সংখ্যা হ্রাস করার জন্য, BufferedReaderএকটি বিশেষ বাফারে ডেটা পড়ে এবং জমা করে এবং আমরা সেখান থেকে এটি পাই। ফলস্বরূপ, ডেটা উত্সটি যতবার অ্যাক্সেস করা হয়েছে তা হ্রাস করা হয়েছে — সম্ভবত বিভিন্ন মাত্রার আদেশ দ্বারা! এর আরেকটি BufferedReaderবৈশিষ্ট্য এবং সাধারণের তুলনায় এর সুবিধা InputStreamReaderহল অত্যন্ত সহায়ক readLine()পদ্ধতি, যা পৃথক সংখ্যা নয়, ডেটার সম্পূর্ণ লাইন পড়ে। বড় টেক্সট নিয়ে কাজ করার সময় এটি অবশ্যই খুব সুবিধাজনক। পড়ার লাইনগুলি দেখতে কেমন তা এখানে:

public class Main { 

   public static void main(String[] args) throws IOException { 

       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 
       String s = reader.readLine(); 
       System.out.println ("The user entered the following text:"); 
       System.out.println(s); 
       reader.close(); 
   } 
}

BufferedReader+InputStreamReader is faster than InputStreamReader alone 
The user entered the following text: 
BufferedReader+InputStreamReader is faster than InputStreamReader alone
BuffreredReader এবং InputStreamReader ক্লাস - 2 এর সাথে কাজ করার অনুশীলন করুনঅবশ্যই, BufferedReaderখুব নমনীয়. আপনি কীবোর্ডের সাথে কাজ করার মধ্যে সীমাবদ্ধ নন। উদাহরণ স্বরূপ, আপনি ওয়েব থেকে সরাসরি ডেটা পড়তে পারেন, কেবলমাত্র একজন পাঠকের কাছে প্রয়োজনীয় URL পাস করে:

public class URLReader { 

   public static void main(String[] args) throws Exception { 

       URL oracle = new URL("https://www.oracle.com/index.html"); 
       BufferedReader in = new BufferedReader( 
               new InputStreamReader(oracle.openStream())); 

       String inputLine; 
       while ((inputLine = in.readLine()) != null) 
           System.out.println(inputLine); 
       in.close(); 
   } 
}
আপনি ফাইল পাথ পাস করে একটি ফাইল থেকে ডেটা পড়তে পারেন:

public class Main { 

   public static void main(String[] args) throws Exception { 

       FileInputStream fileInputStream = new FileInputStream("testFile.txt"); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream)); 

       String str; 

       while ((str = reader.readLine()) != null)   { 
           System.out.println (str); 
       } 

       reader.close(); 
   } 
}

System.out প্রতিস্থাপন করা হচ্ছে

এখন আসুন একটি আকর্ষণীয় ক্ষমতা দেখে নেওয়া যাক যা আমরা আগে স্পর্শ করিনি। আপনি অবশ্যই মনে রাখবেন, Systemক্লাসের দুটি স্ট্যাটিক ক্ষেত্র রয়েছে — System.inএবং  System.out. এই যমজ ভাই স্ট্রিম অবজেক্ট। System.inএকটি InputStream. এবং System.out একটি PrintStream. এই মুহূর্তে, আমরা সম্পর্কে কথা বলতে হবে  System.out. যদি আমরা Systemক্লাসের সোর্স কোডে ড্রপ করি, আমরা এটি দেখতে পাব:

public final class System { 
……………... 
public final static PrintStream out = null; 
 ………… 
} 
সুতরাং,  System.out  এটি ক্লাসের একটি সাধারণ স্ট্যাটিক পরিবর্তনশীলSystem । এটা সম্পর্কে জাদু কিছুই নেই :) outপরিবর্তনশীল একটি PrintStreamরেফারেন্স. এখানে একটি আকর্ষণীয় প্রশ্ন: যখন System.out.println()মৃত্যুদন্ড কার্যকর করা হয়, কেন ঠিক আউটপুট কনসোলে যায় এবং অন্য কোথাও নয়? এবং এই একরকম পরিবর্তন করা যেতে পারে? উদাহরণস্বরূপ, ধরুন আমরা কনসোল থেকে ডেটা পড়তে চাই এবং এটি একটি পাঠ্য ফাইলে লিখতে চাই। System.outঅতিরিক্ত পাঠক এবং লেখক ক্লাসের পরিবর্তে এটি ব্যবহার করে কি কোনভাবে এটি বাস্তবায়ন করা সম্ভব  ? প্রকৃতপক্ষে, এটি :) এবং আমরা এটি করতে পারি যদিও System.outভেরিয়েবলটি সংশোধক দিয়ে চিহ্নিত করা হয় final!  BuffreredReader এবং InputStreamReader ক্লাস - 3 এর সাথে কাজ করার অনুশীলন করুনতাহলে এই ঘটতে আমাদের কি দরকার? প্রথমত, PrintStreamবর্তমানটিকে প্রতিস্থাপন করার জন্য আমাদের একটি নতুন বস্তুর প্রয়োজন। বর্তমান বস্তু, সেটSystemডিফল্টভাবে ক্লাস, আমাদের উদ্দেশ্য পূরণ করে না: এটি কনসোলের দিকে নির্দেশ করে। আপনাকে একটি নতুন তৈরি করতে হবে যা একটি পাঠ্য ফাইলের দিকে নির্দেশ করে — আমাদের ডেটার জন্য "গন্তব্য"৷ দ্বিতীয়ত, আমাদের বুঝতে হবে কিভাবে ভেরিয়েবলে একটি নতুন মান বরাদ্দ করা যায় System.out। আপনি একটি সাধারণ অ্যাসাইনমেন্ট অপারেটর ব্যবহার করতে পারবেন না, কারণ ভেরিয়েবলটি চিহ্নিত করা হয়েছে final। এর শেষ থেকে পিছনে কাজ করা যাক. যেহেতু এটি ঘটে, Systemক্লাসে আমাদের প্রয়োজনীয় পদ্ধতি রয়েছে: setOut(). এটি একটি বস্তু নেয় PrintStreamএবং আউটপুটের জন্য গন্তব্য হিসাবে সেট করে। যে শুধু আমাদের প্রয়োজন! যা অবশিষ্ট থাকে তা হল একটি PrintStreamবস্তু তৈরি করা। এটিও সহজ:

PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
সম্পূর্ণ কোড এই মত দেখাবে:

public class SystemRedirectService { 

   public static void main(String arr[]) throws FileNotFoundException 
   { 
       PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
       /* Save the current value of System.out in a separate variable so that later 
       we can switch back to console output */ 

       PrintStream console = System.out; 
       // Assign a new value to System.out 
       System.setOut(filePrintStream); 
       System.out.println("This line will be written to the text file"); 

       // Restore the old value of System.out 
       System.setOut(console); 
       System.out.println("But this line will be output to the console!"); 
   } 
}
ফলস্বরূপ, প্রথম স্ট্রিংটি টেক্সট ফাইলে লেখা হয়, এবং দ্বিতীয়টি কনসোলে প্রদর্শিত হয় :) আপনি এই কোডটি আপনার IDE-তে অনুলিপি করতে পারেন এবং এটি চালাতে পারেন। টেক্সট ফাইলটি খুলুন এবং আপনি দেখতে পাবেন যে সেখানে স্ট্রিংটি সফলভাবে লেখা হয়েছে :) এর সাথে, আমাদের পাঠ শেষ হয়ে গেছে। আজ আমরা স্ট্রিম এবং পাঠকদের সাথে কাজ কিভাবে প্রত্যাহার. আমরা মনে করেছি কিভাবে তারা একে অপরের থেকে আলাদা এবং এর কিছু নতুন ক্ষমতা সম্পর্কে শিখেছি System.out, যা আমরা প্রায় প্রতিটি পাঠে ব্যবহার করেছি :) পরবর্তী পাঠ পর্যন্ত!
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION