জাভাতে কনসোল থেকে একক চর কীভাবে পড়বেন (ব্যবহারকারী এটি টাইপ করেন)?


110

ব্যবহারকারী জাভাতে টাইপ করায় কনসোল থেকে একটি একক চর পড়ার কী সহজ উপায় আছে? এটা কি সম্ভব? আমি এই পদ্ধতিগুলি দিয়ে চেষ্টা করেছি তবে তারা সকলেই এন্টার কীটি চাপতে ব্যবহারকারীর জন্য অপেক্ষা করে :

char tmp = (char) System.in.read();
char tmp = (char) new InputStreamReader(System.in).read ();
char tmp = (char) System.console().reader().read();           // Java 6

আমি ভাবতে শুরু করি যে এন্টার চাপ না দেওয়া পর্যন্ত System.in ব্যবহারকারী ইনপুট সম্পর্কে সচেতন নয় ।

উত্তর:


57

আপনি যা করতে চান তা "কাঁচা" মোডে কনসোলটি রেখে দেওয়া (লাইন সম্পাদনা বাইপাস করা এবং কোনও প্রবেশ কী প্রয়োজন নেই) "রান্না করা" মোডের বিপরীতে (প্রবেশ কী দ্বারা প্রান্তরেখা সম্পাদনা প্রয়োজন।) ইউএনআইএক্স সিস্টেমে 'স্টাটি' কমান্ডটি পারেন মোড পরিবর্তন করুন।

এখন জাভা সম্পর্কিত ... পাইথন এবং জাভাতে নন ব্লকিং কনসোল ইনপুট দেখুন । উদ্ধৃতাংশ:

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

পরামর্শগুলির মধ্যে একটি হ'ল জেএনআই ব্যবহার করা। আবার, এটি খুব বহনযোগ্য নয়। থ্রেডের শেষে এবং উপরের পোস্টের সাথে সাদৃশ্যযুক্ত আরও একটি পরামর্শ হ'ল jCurses ব্যবহার করা ।


4
জ্যাকারসগুলি খুব পোর্টেবলও নয় ... জেসিউর্স পুনরায় পড়ুন থেকে: "জেসক্রেস দুটি অংশ নিয়ে গঠিত: প্লাটফর্মের স্বতন্ত্র অংশ এবং প্লাটফর্ম নির্ভর অংশ যা একটি নেটিভ শেয়ার্ড লাইব্রেরি নিয়ে গঠিত যা প্রথম অংশে আদিম ইনপুট এবং আউটপুট ক্রিয়াকলাপ উপলব্ধ করে তোলে । "
রায়ান ফার্নান্দিস

6
@ রায়ানফারানডিস আমার কাছে যথেষ্ট পোর্টেবল শোনায় - একক সরঞ্জাম যা একাধিক সিস্টেমে চালানো যেতে পারে (বিভিন্ন নির্ভরতা ব্যবহার করে)
অ্যান্টোনিওসেস

25

আপনাকে আপনার কনসোলটি কাঁচা মোডে কড়াতে হবে। সেখানে যাওয়ার কোনও বিল্ট-ইন প্ল্যাটফর্ম-স্বাধীন উপায় নেই। jCurses আকর্ষণীয় হতে পারে, যদিও।

ইউনিক্স সিস্টেমে এটি কাজ করতে পারে:

String[] cmd = {"/bin/sh", "-c", "stty raw </dev/tty"};
Runtime.getRuntime().exec(cmd).waitFor();

উদাহরণস্বরূপ, আপনি কী-স্ট্রোকগুলির মধ্যে সময়টি বিবেচনায় নিতে চাইলে, সেখানে যাওয়ার জন্য নমুনা কোডটি এখানে।


লিনাক্সের অধীনে আমার জন্য দুর্দান্ত কাজ করেছেন
MrSmith42

4
পাশাপাশি ম্যাক কাজ। আপনি সম্ভবত উল্লেখ করতে চান যে stty cooked </dev/ttyপ্রোগ্রামটি যখন বাফার মোডে ফিরে যেতে হবে এবং অবশ্যই প্রোগ্রামটি বেরোনোর ​​আগে অবশ্যই চালানো উচিত।
কেলভিন

15

জাভা কনসোল থেকে কাঁচা অক্ষরগুলি পড়ার কোনও পোর্টেবল উপায় নেই।

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


22
আমি মোটেও বুঝতে পারি না কেন উদাহরণস্বরূপ মনো (বা সিএলআর) এর System.Console.ReadKeyসমস্ত প্ল্যাটফর্মগুলিতে কাজ করে। জাভা প্রতিটি প্ল্যাটফর্মের জন্য প্ল্যাটফর্ম নির্ভর লাইব্রেরি এবং বাস্তবায়নের সাথে জেভিএম এবং জেআরই বিতরণ করে, তাই কোনও বাহানা নেই।
মার্টিন ম্যাকাক

13

আমি একটি জাভা ক্লাস RawConsoleInput লিখেছি যা উইন্ডোজ এবং ইউনিক্স / লিনাক্সের অপারেটিং সিস্টেমের ফাংশনগুলিকে কল করতে জেএনএ ব্যবহার করে ।

  • উইন্ডোজ এ এটি ব্যবহার করে _kbhit()এবং _getwch()এমএসভিসিআরটি.ডিএল থেকে।
  • ইউনিক্সে এটি tcsetattr()কনসোলটিকে নন-ক্যানোনিকাল মোডে স্যুইচ করতে, System.in.available()ডেটা উপলব্ধ কিনা তা পরীক্ষা করতে এবং System.in.read()কনসোল থেকে বাইটগুলি পড়তে ব্যবহার করে। CharsetDecoderবাইটকে অক্ষরে রূপান্তর করতে A ব্যবহার করা হয়।

এটি অ-অবরোধকারী ইনপুট এবং কাঁচা মোড এবং সাধারণ লাইন মোড ইনপুটকে মেশানো সমর্থন করে।


এটি কতটা ভারীভাবে পরীক্ষা / চাপ-পরীক্ষা করা হয়েছে?
ফান্ড মনিকার লসুইট

2
@ কিপ্যায়েট্যাক্সস কনসোল ইনপুটটির জন্য স্ট্রেস-টেস্টিং কঠিন। আমি মনে করি, এক্ষেত্রে এটি বিভিন্ন পরিবেশে পরীক্ষা করা আরও গুরুত্বপূর্ণ হবে (বিভিন্ন উইন্ডোজ / লিনাক্স সংস্করণ, /৪/32২ বিট, এসএসএইচ, টেলনেট, সিরিয়াল পোর্ট বা ডেস্কটপ কনসোল ইত্যাদি) লিনাক্স। এখন পর্যন্ত আমি এটি কেবলমাত্র আমার ব্যক্তিগত পরীক্ষার সরঞ্জামগুলিতে ব্যবহার করি। তবে উত্স কোডটি অন্যান্য সমাধানের তুলনায় তুলনামূলকভাবে কম (জে লাইন 2 যা জানসি ব্যবহার করে)। সুতরাং ভুল হতে পারে যে খুব বেশি কিছু নেই। আমি এটি লিখেছিলাম, কারণ JLine2 ব্লকিং ছাড়াই একক অক্ষর ইনপুট সমর্থন করে না।
খ্রিস্টান ডি হিউরিউজ 23

এটাই আমি চাপ-পরীক্ষার দ্বারা বোঝাতে চেয়েছি - এটি সম্ভবত ভুল শব্দ; আমার খারাপ যাইহোক, দুর্দান্ত! আমি স্কুলের জন্য একটি প্রকল্পে ^ এইচ ^ এইচ ^ এইচ ^ এইচ ^ এইচকে চুরি করেছি এবং এটি একগুচ্ছকে সহায়তা করেছে।
ফান্ড মনিকার লসুইট

আরে - এই শ্রেণিটি দুর্দান্ত দেখাচ্ছে। তবে: আমি এটি কাজ করতে পারি না .. এটি কীভাবে ব্যবহার করার কথা? আমি সিটিআরএল + ডি (লিনাক্সে) চাপ না দেওয়া পর্যন্ত আমি সিস্টেমে.ইনকে ব্লক করার মুখোমুখি হয়েছি এবং এখন আমি কনসোল মোডগুলি এবং পছন্দগুলি সম্পর্কে পড়ছি। আমি মনে করি আপনার RawConsoleInput যা আমি খুঁজছি - তবে আমি কীভাবে এটি ব্যবহার করব?
ইগোর

@ আইগর একটি কীবোর্ড অক্ষর পড়তে কেবল রাউকনসোলইনপুট.ব্রেড (বুলিয়ান) কল করুন। এটি উত্স কোড (RawConsoleInput.java) তে নথিভুক্ত।
খ্রিস্টান ডি হিউরিউজ

8

Jline3 ব্যবহার করুন :

উদাহরণ:

Terminal terminal = TerminalBuilder.builder()
    .jna(true)
    .system(true)
    .build();

// raw mode means we get keypresses rather than line buffered input
terminal.enterRawMode();
reader = terminal .reader();
...
int read = reader.read();
....
reader.close();
terminal.close();

আমি খুঁজে পেয়েছি যে RawConsoleInput ভিত্তিক সমাধানগুলি ম্যাকস হাই সিয়েরায় কাজ করে না; তবে এটি পুরোপুরি কাজ করে works
RawToast

jline এর কার্যতঃ একটি ইন্টারেক্টিভ কনসোল / টার্মিনাল সিস্টেম তৈরি করার দরকার রয়েছে। এটি লিনাক্সে দুর্দান্ত কাজ করে। আরও সম্পূর্ণ উদাহরণের জন্য দেখুন: github.com/jline/jline3/blob/master/builtins/src/test/java/org/… । এটা তোলে স্বয়ংসম্পূর্ণ, ইতিহাস, পাসওয়ার্ড মাস্ক ইত্যাদি রয়েছে
Lepe
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.