স্ক্যানার বনাম বাফারডারিডার


284

আমি যতদূর জানি, জাভাতে কোনও ফাইল থেকে অক্ষর-ভিত্তিক ডেটা পড়ার দুটি সবচেয়ে সাধারণ পদ্ধতি ব্যবহার করছে Scannerবা BufferedReader। আমি আরও জানি যে BufferedReaderশারীরিক ডিস্ক ক্রিয়াকলাপ এড়ানোর জন্য বাফার ব্যবহার করে পঠনগুলি দক্ষতার সাথে ফাইলগুলি পড়ে।

আমার প্রশ্নগুলি হ'ল:

  • নেই Scannerসেইসাথে সঞ্চালন BufferedReader?
  • আপনি কেন বা Scannerতার BufferedReaderবিপরীতে নির্বাচন করবেন ?

1
আমি সাধারণত স্ট্যান্ডার্ড থেকে পড়ার জন্য স্ক্যানার ব্যবহার করি ('স্ক্যানার ইন = নতুন স্ক্যানার (System.in)' অনেক বেশি ক্লিনার মনে হয়)। এটি আসলে কম দক্ষ কিনা তা নিশ্চিত নন, তবে যেহেতু স্ট্যান্ড-ইন থেকে পড়া ব্লক করা হচ্ছে, তাই আমি স্ক্যানারের দক্ষতার বিষয়টি ভাবতে পারি না।
dimo414

উত্তর:


201

Scannerস্রোতের বিষয়বস্তু থেকে টোকেনগুলি পার্সিংয়ের জন্য ব্যবহৃত হয় যখন BufferedReaderকেবল স্ট্রিমটি পড়ে এবং কোনও বিশেষ পার্সিং করে না।

বস্তুত আপনি একটি পাস করতে পারেন BufferedReaderএকটি থেকে scannerঅক্ষর উৎস বিশ্লেষণ করতে হয়।


55
বাফারড্রিডার সিঙ্ক্রোনাইজ করা হয়েছে এবং স্ক্যানারটি নয়, তাই সিদ্ধান্ত নেওয়ার বিষয়টি আপনার।
রূবেন

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

@ রিউবেন তবে Scannerশেষ পর্যন্ত এর ইনপুটটির জন্য অন্য কোনও কিছুর উপর নির্ভর করে যা ভালভাবে সিঙ্ক্রোনাইজ হতে পারে।
লার্নের মারকুইস

189

বর্তমানে সর্বশেষ জেডিকে 6 রিলিজ / বিল্ড (বি 27) এ ( 8192 চর ) এর বিপরীতে Scannerএকটি ছোট বাফার ( 1024 অক্ষর ) রয়েছে, তবে এটি যথেষ্ট পরিমাণে বেশি।BufferedReader

পছন্দ হিসাবে, আপনি Scannerযদি ফাইলটি বিশ্লেষণBufferedReader করতে চান তবে এটি ব্যবহার করুন, আপনি যদি লাইন দিয়ে ফাইল লাইন পড়তে চান তবে এটি ব্যবহার করুন । তাদের পূর্ব লিঙ্কযুক্ত এপিআই ডকুমেন্টেশনের সূচনা পাঠ্যও দেখুন।

  • পার্সিং = প্রদত্ত ইনপুটটি টোকেন (অংশ) হিসাবে ব্যাখ্যা করছে। এটি আপনাকে নির্দিষ্ট অংশগুলি সরাসরি ইন্ট, স্ট্রিং, দশমিক ইত্যাদি হিসাবে ফিরিয়ে দিতে সক্ষম হয় বর্গের সমস্ত nextXxx()পদ্ধতিও দেখুন methodsScanner
  • পড়া = বোবা স্ট্রিমিং। এটি আপনাকে সমস্ত অক্ষর ফিরিয়ে দিয়ে চলেছে, যা আপনাকে পরিবর্তিতভাবে কোনও ম্যাচ বা দরকারী কিছু রচনা করতে চাইলে ম্যানুয়ালি পরীক্ষা করতে হবে। তবে আপনার যদি যাইহোক এটি করার প্রয়োজন না হয় তবে পড়া যথেষ্ট।

1
সুন্দর. বাফার টিপ জন্য ধন্যবাদ। দেশী পাঠ্য চূড়ান্ত ব্যয়বহুল হিসাবে এটি সব খুঁজছিলেন
পৌঁছান

7
@ আসিফ: পার্সিং = প্রদত্ত ইনপুটটি টোকেন (অংশ) হিসাবে ব্যাখ্যা করছে। এটি সরাসরি ইন্টার, স্ট্রিং, দশমিক ইত্যাদি হিসাবে নির্দিষ্ট অংশগুলি আপনাকে ফিরিয়ে দিতে সক্ষম Sc স্ক্যানার ক্লাসে পরবর্তী সমস্ত এক্সএক্সএক্সএক্সএক্স () পদ্ধতিগুলিও দেখুন। পড়া = বোবা স্ট্রিমিং। এটি আপনাকে সমস্ত অক্ষর ফিরিয়ে দিয়ে চলেছে, যা আপনাকে পরিবর্তিতভাবে কোনও ম্যাচ বা দরকারী কিছু রচনা করতে চাইলে ম্যানুয়ালি পরীক্ষা করতে হবে। তবে আপনার যদি যাইহোক এটি করার প্রয়োজন না হয় তবে পড়া যথেষ্ট।
বালুসসি

@ বালুসসি ওকে আমি ইতিমধ্যে ব্যবহার করেছি, readInt();রিডফ্লোট (); ইত্যাদি এখন পার্সিংয়ের অর্থ কী। এবং বালুসসি আপনি আমাকে চ্যাট রুমে মাত্র 10 মিনিট সময় দিতে খুব সামান্য সময় দিতে পারেন, আমি বাফার্ড সম্পর্কে কীভাবে এটি কাজ করে তা সম্পর্কে একটু জিজ্ঞাসা করতে চাই।
আসিফ মোশতাক

আমি BufferedReaderস্ক্যানারের কনস্ট্রাক্টরে মোড়ানো কি ? এই একটি ভাল ধারণা?
ভিভেক

1
Scannerপ্যাটার্ন মিলের প্রয়োজন হিসাবে এর বাফারটি প্রসারিত করা হবে। সুতরাং আপনি যদি আরও বড় বাফার চান তবে আপনার কেবলমাত্র অনুরোধ করা দরকার, উদাহরণস্বরূপ findWithinHorizon("\\z", 8192), এটির পরে এবং তারপরে, এটি 8192অক্ষরের ক্ষমতা সহ বাফার ব্যবহার করবে (বা এটির চেয়ে ছোট হলে সম্পূর্ণ ফাইল)।
হলগার

77

এই লিঙ্কটি দেখুন , নীচে থেকে উদ্ধৃত হয়েছে:

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

বাফার্ডআরডার সিঙ্ক্রোনাইজ করা হয়েছে, সুতরাং একটি বাফার্ডআডার উপর পঠন অপারেশনগুলি একাধিক থ্রেড থেকে নিরাপদে করা যায় can

অন্যদিকে একটি স্ক্যানারে এতে আরও অনেক বেশি পনির নির্মিত হয়; এটি একটি বাফার্ডারিডার যা করতে পারে এবং দক্ষতার একই স্তরেও তা করতে পারে। তবে, এ ছাড়াও কোনও স্ক্যানার নিয়মিত অভিব্যক্তি ব্যবহার করে আদিম ধরণের এবং স্ট্রিংয়ের জন্য অন্তর্নিহিত স্ট্রিমটিকে বিশ্লেষণ করতে পারে। এটি আপনার পছন্দের ডিলিমিটারের সাথে অন্তর্নিহিত স্ট্রিমটিও টোকানাইজ করতে পারে। এটি ডিলিমিটারকে অগ্রাহ্য করে অন্তর্নিহিত স্ট্রিমের ফরোয়ার্ড স্ক্যানিংও করতে পারে!

কোনও স্ক্যানার তবে থ্রেড নিরাপদ নয়, এটি বাহ্যিকভাবে সিঙ্ক্রোনাইজ করতে হবে।

আপনি যদি একটি সাধারণ লগ রিডার লেখেন তবে বাফার্ড রিডার যথেষ্ট পরিমাণে বাফার্ডারীডার বা স্ক্যানার ব্যবহার করে আপনি যে কোডটি লিখছেন তা নির্ভর করে। তবে আপনি যদি একটি এক্সএমএল পার্সার লিখছেন তবে স্ক্যানার আরও প্রাকৃতিক পছন্দ।

এমনকি ইনপুট পড়ার সময়, যদি লাইন দ্বারা ব্যবহারকারী ইনপুট লাইনটি গ্রহণ করতে চান এবং কেবল এটি কোনও ফাইলে যুক্ত করতে চান, তবে একটি বাফার্ডআরডার যথেষ্ট ভাল। অন্যদিকে আপনি যদি একাধিক বিকল্পের সাহায্যে কমান্ড হিসাবে ব্যবহারকারী ইনপুট গ্রহণ করতে চান এবং তারপরে নির্দিষ্ট কমান্ড এবং বিকল্পগুলির উপর ভিত্তি করে বিভিন্ন ক্রিয়াকলাপ সম্পাদন করতে চান, তবে স্ক্যানার আরও ভাল suit


"অন্যদিকে একটি স্ক্যানারের মধ্যে এতে আরও অনেক বেশি পনির নির্মিত রয়েছে; এটি একটি বাফারড্রেডার যা করতে পারে এবং দক্ষতার একই স্তরেও তা করতে পারে" " সম্মত হবেন না, স্ক্যানারের তুলনায় বাফারড্রেডার কিছুটা দ্রুত কারণ স্ক্যানার ইনপুট ডেটা পার্সিং করে এবং বাফারড্রেডার কেবল অক্ষরের অনুক্রম পাঠ করে।
প্রতীক

40
  1. BufferedReaderস্ক্যানারের চেয়ে উল্লেখযোগ্য পরিমাণে বড় বাফার মেমরি রয়েছে। BufferedReaderআপনি যদি একটি স্ট্রিম থেকে দীর্ঘ স্ট্রিং পেতে চান তবে ব্যবহার করুন এবং Scannerআপনি যদি একটি স্ট্রিম থেকে নির্দিষ্ট ধরণের টোকেনকে পার্স করতে চান তবে ব্যবহার করুন ।

  2. Scannerকাস্টম ডিলিমিটার ব্যবহার করে টোকেনাইজ ব্যবহার করতে পারে এবং স্ট্রিমটিকে আদিম ধরণের ডেটাতে পার্স BufferedReaderকরতে পারে , যখন কেবল স্ট্রিং পড়তে এবং সঞ্চয় করতে পারে।

  3. BufferedReaderScannerনা হলেও সিঙ্ক্রোনাস । BufferedReaderআপনি যদি একাধিক থ্রেড নিয়ে কাজ করছেন তবে ব্যবহার করুন ।

  4. Scannerআইওএক্সেপশনটি লুকিয়ে রাখার সাথে সাথে BufferedReaderএটিকে ততক্ষণে ছুঁড়ে দেয়।


18

আমি BufferedReaderপাঠ্য পড়ার জন্য ব্যবহার করার পরামর্শ দিচ্ছি । অবিলম্বে ছুড়ে দেওয়ার সময় Scannerলুকিয়ে রাখে ।IOExceptionBufferedReader


12

বাফার্ডারিডার এবং স্ক্যানারের মধ্যে পার্থক্য নিম্নলিখিত:

  1. বাফারড্রিডার সিঙ্ক্রোনাইজ করা হয়েছে তবে স্ক্যানার সিঙ্ক্রোনাইজ করা হয়নি
  2. বাফার্ডরিডার থ্রেড নিরাপদ তবে স্ক্যানার থ্রেড নিরাপদ নয়
  3. বাফারড্রেডারের বড় বাফার মেমরি রয়েছে তবে স্ক্যানারের সাথে আরও ছোট বাফার মেমরি রয়েছে
  4. বাফারডারিডারটি দ্রুত তবে স্ক্যানার কার্যকর কার্যকর হয় না
  5. কনসোল থেকে একটি লাইন পড়ার কোড:

    বাফার্ডরিডার :

     InputStreamReader isr=new InputStreamReader(System.in);
     BufferedReader br= new BufferedReader(isr);
     String st= br.readLine();

    স্ক্যানার :

    Scanner sc= new Scanner(System.in);
    String st= sc.nextLine();

8

নীচে বাফার্ডারিডার এবং স্ক্যানারের মধ্যে পার্থক্য রয়েছে

  1. বাফারড্রেডার কেবল ডেটা পড়ে তবে স্ক্যানার ডেটা পার্স করে।
  2. আপনি কেবল বাফার্ডারিডার ব্যবহার করে স্ট্রিং পড়তে পারেন তবে আপনি স্ক্যানার ব্যবহার করে ইনট, লম্বা বা ভাসতে পারেন।
  3. বাফারড্রিডার স্ক্যানার থেকে পুরানো, এটি জেডিকে ১.১ থেকে পাওয়া যায় এবং স্ক্যানার জেডিকে ৫ রিলিজে যুক্ত হয়েছিল।
  4. স্ক্যানারের 1KB এর তুলনায় বাফারডিডারের বাফার আকারটি বড় (8 কেবি)।
  5. লম্বা স্ট্রিংয়ের সাথে বাফারড্রেডার ফাইল পড়ার জন্য আরও উপযুক্ত এবং স্ক্যানার কমান্ড প্রম্পট থেকে ছোট ব্যবহারকারী ইনপুট পড়ার জন্য আরও উপযুক্ত।
  6. বাফারড্রিডার সিঙ্ক্রোনাইজ করা হয়েছে তবে স্ক্যানারটি নয়, যার অর্থ আপনি একাধিক থ্রেডের মধ্যে স্ক্যানার ভাগ করতে পারবেন না।
  7. বাফারড্রিডার স্ক্যানারের চেয়ে দ্রুততর কারণ এটি পার্সিংয়ে সময় ব্যয় করে না
  8. স্ক্যানারের তুলনায় বাফারড্রেডার কিছুটা দ্রুত
  9. বাফারড্রিডারটি জাভা.ইও প্যাকেজ থেকে এবং স্ক্যানারটি java.util প্যাকেজ থেকে পয়েন্টগুলির ভিত্তিতে আমরা আমাদের পছন্দটি নির্বাচন করতে পারি।

ধন্যবাদ


6

প্রধান পার্থক্য:

  1. স্ক্যানার

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

উদাহরণ

 String input = "1 fish 2 fish red fish blue fish";
 Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
 System.out.println(s.nextInt());
 System.out.println(s.nextInt());
 System.out.println(s.next());
 System.out.println(s.next());
 s.close(); 

নিম্নলিখিত আউটপুট মুদ্রণ:

 1
 2
 red
 blue 

এই কোড সহ একই আউটপুট উত্পন্ন হতে পারে, যা একবারে চারটি টোকেনকে বিশ্লেষণ করতে নিয়মিত অভিব্যক্তি ব্যবহার করে:

 String input = "1 fish 2 fish red fish blue fish";

 Scanner s = new Scanner(input);
 s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
 MatchResult result = s.match();
 for (int i=1; i<=result.groupCount(); i++)
     System.out.println(result.group(i));
 s.close(); `


  1. BufferedReader:

    • একটি অক্ষর-ইনপুট স্ট্রিম থেকে পাঠ্য পড়ায়, অক্ষরগুলি বাফার করে যাতে অক্ষর, অ্যারে এবং লাইনগুলির দক্ষ পাঠের ব্যবস্থা করা যায়।

    • বাফার আকার নির্দিষ্ট করা যেতে পারে, বা ডিফল্ট আকার ব্যবহার করা যেতে পারে। বেশিরভাগ উদ্দেশ্যে ডিফল্ট যথেষ্ট বড়।

সাধারণভাবে, একটি পাঠকের তৈরি প্রতিটি পঠন অনুরোধ অন্তর্নিহিত চরিত্র বা বাইট স্ট্রিমের সাথে সম্পর্কিত পঠন অনুরোধের কারণ ঘটায়। সুতরাং যে কোনও পাঠকের আশেপাশে একটি বাফারডারিডার মোড়ানো পরামর্শ দেওয়া হয় যার রিড () অপারেশনগুলি ব্যয়বহুল হতে পারে, যেমন ফাইলরেডার এবং ইনপুট স্ট্রিমরেডার্স। উদাহরণ স্বরূপ,

BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));

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

সূত্র: লিংক


3

জাভাতে ইনপুট নেওয়ার বিভিন্ন উপায় রয়েছে:

1) বাফারডারিডার 2) স্ক্যানার 3) কমান্ড লাইন আর্গুমেন্ট

বাফার্ডআরেডার একটি অক্ষর-ইনপুট স্ট্রিমের পাঠ্য পড়ুন, অক্ষরগুলি বাফার করুন যাতে অক্ষর, অ্যারে এবং লাইনগুলির দক্ষ পাঠের ব্যবস্থা করা যায়।

স্ক্যানার হ'ল একটি সাধারণ পাঠ্য স্ক্যানার যা নিয়মিত এক্সপ্রেশন ব্যবহার করে আদিম ধরণের এবং স্ট্রিংগুলিকে পার্স করতে পারে।

আপনি যদি একটি সাধারণ লগ রিডার লিখছেন তবে বুফার্ড রিডার যথেষ্ট। আপনি যদি কোনও এক্সএমএল পার্সার লিখছেন তবে স্ক্যানার আরও প্রাকৃতিক পছন্দ।

আরও তথ্যের জন্য দয়া করে দেখুন:

http://java.meritcampus.com/t/240/Bufferedreader?tc=mm69


1

নীচের উত্তরটি কনসোল থেকে রিডিং থেকে নেওয়া হয়েছে : জাভা স্ক্যানার বনাম বাফার্ডারিডার

কনসোল থেকে কোনও ইনপুট পড়লে, এটি অর্জনের জন্য দুটি বিকল্প রয়েছে। প্রথম ব্যবহার Scanner, অন্য ব্যবহার BufferedReader। দুজনেরই আলাদা আলাদা বৈশিষ্ট্য রয়েছে। এর অর্থ কীভাবে এটি ব্যবহার করতে হয় তার মধ্যে পার্থক্য।

স্ক্যানার প্রদত্ত ইনপুটটিকে টোকেন হিসাবে বিবেচনা করে। বাফার্ডআডার কেবল স্ট্রিং হিসাবে দেওয়া ইনপুটটিকে লাইন দ্বারা পঠন করে। স্ক্যানার এটি নিজেই পরবর্তী (যেমন), পরের ফ্লোট () এর মতো পার্সিং ক্ষমতা সরবরাহ করে।

কিন্তু, অন্যদের মধ্যে পার্থক্য কি?

  • স্ক্যানার প্রদত্ত ইনপুটটিকে টোকেন হিসাবে বিবেচনা করে। স্ট্রিম লাইন / স্ট্রিং হিসাবে বাফারড্রেডার
  • রেজেনেক্স ব্যবহার করে স্ক্যানার টোকেনাইজড দেওয়া ইনপুট। বাফার্ডারিডার ব্যবহার করে অবশ্যই অতিরিক্ত কোড লিখতে হবে
  • স্ক্যানার * পয়েন্ট নংয়ের চেয়ে দ্রুত বাফার রিডার। 2
  • স্ক্যানার সিঙ্ক্রোনাইজ করা হয় নি, বাফার্ডরিডার সিঙ্ক্রোনাইজড

JDK সংস্করণ 1.5 উচ্চতর থেকে স্ক্যানারটি আসে।

স্ক্যানার, বা বাফার রিডার কখন ব্যবহার করা উচিত?

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


0
  1. বাফারড্রেডার সম্ভবত আপনাকে আরও ভাল পারফরম্যান্স দেবে (কারণ স্ক্যানার ইনপুটস্ট্রিম রিডার উপর ভিত্তি করে, উত্সগুলি দেখুন)। আপস, ফাইলগুলি পড়ার জন্য এটি নিও ব্যবহার করে। আমি যখন বড় ফাইলগুলির জন্য বাফারড্রেডার পারফরম্যান্সের বিরুদ্ধে নিও পারফরম্যান্স পরীক্ষা করেছি তখন nio কিছুটা আরও ভাল পারফরম্যান্স দেখায়।
  2. ফাইল থেকে পড়ার জন্য অ্যাপাচি কমন্স আইও ব্যবহার করে দেখুন।

0

আমি পছন্দ করি Scannerকারণ এটি চেক করা ব্যতিক্রমগুলি ছুঁড়ে না ফেলে এবং তাই এর ব্যবহারের ফলাফল আরও প্রবাহিত কোডে আসে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.