জাভাতে ইনপুট পেতে আমাদের কেন স্ক্যানার ক্লাসের উদাহরণ প্রয়োজন?


10

জাভা অবজেক্ট অরিয়েন্টেড, তবে, ইনপুট পেতে কেন আমাদের স্ক্যানার ক্লাস থেকে একটি অবজেক্ট তৈরি করা দরকার? করা যায়নি next()পদ্ধতি, উদাহরণস্বরূপ, শুধু স্ট্যাটিক হবে?

সি আমাকে প্রশংসনীয় সহজ হিসাবে আপনি শুধু ব্যবহার দেখায় scanf(), gets()বা fgets()। আমি নিশ্চিত যে স্ক্যানার ক্লাস তৈরির জন্য জাভা বিকাশকারীদের একটি কারণ রয়েছে, তবে কাজটি করার জন্য একটি সাধারণ ক্রিয়াকলাপটি করা কীভাবে ভাল?

আমি এই লিঙ্কটি খুঁজে পেয়েছি যা সম্ভবত একই প্রশ্ন জিজ্ঞাসা করতে পারে তবে উত্তরগুলি প্রায় are

"আপনার কোনও অবজেক্ট তৈরি করা দরকার কারণ এটি অচল নয়" ...

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

যদি কেউ প্রশ্নটিকে আরও স্পষ্ট করে তুলতে সম্পাদনা করতে পারে তবে আমি প্রশংসা করব!

উত্তর:


34

উত্তরটি "কারণ কোনও স্ক্যানারের স্টেট রয়েছে।"

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

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

যখন কেউ তাত্ত্বিকভাবে স্ট্যাটিক স্ক্যানারের দিকে তাকান - সমস্ত রাজ্য বর্গের বাইরে বজায় থাকে, তবে এটি শ্রেণীর মধ্যে আবদ্ধ হয় না। কোডের অন্যান্য বিটগুলি সেই ভেরিয়েবলগুলির সাথে টিঙ্কার করতে পারে। যখন অন্যান্য কোড শ্রেণীর রাজ্যের সাথে ঝাঁকুনি দিতে পারে, শ্রেণি কোনও নির্দিষ্ট পরিস্থিতিতে কী করবে তা নিয়ে तर्क করা খুব কঠিন হয়ে পড়ে।

আপনি, হতে পারে, মতো কিছু লিখতে ScannerState { Locale loc; ... }এবং কোড থাকতে পারে যার ফলাফল:

ScannerState state = new ScannerState(a whole lot of arguments);
int foo = Scanner.nextInt(state);

তবে, এটি প্রথমে স্ক্যানার বস্তুর মধ্যে রাষ্ট্রকে আবদ্ধ করে রাখা (এবং রাজ্যে পাস করার প্রয়োজন নেই) এর চেয়ে অনেক জটিল।

শেষ অবধি, স্ক্যানার ইন্টারফেস প্রয়োগ করে Iterator<String>যার অর্থ হল যে কেউ কোডে এটি ব্যবহার করতে পারে:

Scanner in = new Scanner(someFile);
whie(in.hasNext()) { ... }

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


1
আপনার লেখা সমস্ত কিছুই একেবারে সত্য, যদিও ইনপুট স্ট্রিমেরও রাজ্য রয়েছে, কেবল স্ক্যানার নয়। যদি ইনপুটটি কনসোল থেকে আসে, যেমন সি এর মতো, আপনাকে ইনপুট নেওয়া শুরু করতে কোনও পরামিতি পাস করার দরকার নেই। আমি এটা এই ভাবে অন্য স্ট্রিম করা হয় যা দিয়ে সামঞ্জস্যপূর্ণ হতে করা হয়েছিল অনুমান করা না রাষ্ট্র প্রয়োজন।
নীল

@Neil InputStream সমান FILE*সি (অবস্থান অঙ্গরাজ্য)
র্যাচিট খামখেয়াল

1
স্ক্যানার প্রয়োগ Iterator- না Iterable। বর্ধিত লুপে স্ক্যানার ব্যবহার করা অসম্ভব।
টারবানফ অফ

নিখুঁতভাবে ফাইল-ইনপুট স্ট্রিমগুলির অবশ্যই এটি "স্টেট" থাকে তবে এটি ইতিমধ্যে প্রযুক্তিগতভাবে খোলা থাকায় এটি কনসোল থেকে ইনপুট প্রয়োগ করতে পারে না।
নীল

1
@ তুরবানফ যে আমাকে ফোন করার জন্য আপনাকে ধন্যবাদ। আমি এটা সংশোধন করেছি।

7

সংক্ষিপ্ত উত্তর: আপনি না। আপনি কোনও স্ক্যানার উদাহরণ ব্যবহার না করেই ব্যবহারকারী ইনপুট পেতে পারেন।
উদাহরণস্বরূপ: https://docs.oracle.com/javase/tutorial/essential/io/cl.html বা
http://alvinalexender.com/blog/post/java/java-source-code-read-command-line -ইনপুট


String orgName = (new BufferedReader(new InputStreamReader(System.in))).readLine();এটি ব্যবহারের সাথে তুলনা করে মারাত্মকভাবে সংশ্লেষিত হয় Scannerএবং এগুলি সরাসরি ত্যাগ করার জন্য একটি নয় দুটি বস্তুর নতুন উদাহরণ তৈরি করে creates
ফিলিপ

2
@ ফিলিপ, ১) এটি জটিল, তবে এটি অবশ্যই একটি বিকল্প এবং ২) যদি আপনি এখনই উদাহরণস্বরূপ কিছুটা ভুল করছেন (বা আপনার সত্যিকারের কনসোল থেকে কেবল একটি লাইন পড়তে হবে) disc
আর্টুরো টরেস সানচেজ

ইনপুট পড়ার জন্য আপনার স্ক্যানারের প্রয়োজন নেই। আপনার একটি ইনপুট স্ট্রিম রিডারও প্রয়োজন নেই এবং আপনার কোনও বাফার্ডারীডারও লাগবে না। আপনি System.in এ "কাঁচা" স্ট্রিমের সাথে কাজ করতে পারেন ঠিক তেমন সি এর মতোই an স্ট্রিমটি গ্রাস করার জন্য খুব সহজেই আরামদায়ক উপায় স্ক্যানার।
ট্রাবেনফুচস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.