ইনপুটস্ট্রিম ব্যবহার করা হচ্ছে av উপলব্ধ ()
এটি System.in. সর্বদা গ্রহণযোগ্য (0) ফেরত পাওয়া যায়।
আমি বিপরীতটি পেয়েছি - এটি সর্বদা উপলভ্য বাইটের সংখ্যার জন্য সর্বোত্তম মান প্রদান করে। জাভাডোক এর জন্য InputStream.available()
:
Returns an estimate of the number of bytes that can be read (or skipped over)
from this input stream without blocking by the next invocation of a method for
this input stream.
সময় / বাসি থাকার কারণে একটি অনুমান অপরিহার্য। চিত্রটি এক-অফ-অবমূল্যায়ন হতে পারে কারণ নতুন ডেটা প্রতিনিয়ত আগত হয়। তবে এটি সর্বদা পরবর্তী কলটিতে "ক্যাচ আপ" - এটি সমস্ত আগত ডেটার জন্য অ্যাকাউন্ট হওয়া উচিত, বারটি যা নতুন কল করার মুহুর্তে আসে। তথ্য থাকা অবস্থায় স্থায়ীভাবে 0 ফিরিয়ে দেওয়া উপরের শর্তটি ব্যর্থ করে।
প্রথম ক্যাভেট: ইনপুট স্ট্রিমের কংক্রিট সাবক্লাসগুলি উপলভ্য জন্য দায়বদ্ধ ()
InputStream
একটি বিমূর্ত শ্রেণি। এটির কোনও ডেটা উত্স নেই। এটি উপলভ্য ডেটা থাকা অর্থহীন। অতএব, জাভাদোক available()
এছাড়াও বলে:
The available method for class InputStream always returns 0.
This method should be overridden by subclasses.
এবং প্রকৃতপক্ষে, কংক্রিট ইনপুট স্ট্রিম ক্লাসগুলি ধ্রুবক 0 টি নয়, অর্থবহ মানগুলি সরবরাহ করে () উপলভ্য করে।
দ্বিতীয় ক্যাভেট: উইন্ডোজ ইনপুট টাইপ করার সময় আপনি ক্যারেজ-রিটার্ন ব্যবহার করবেন তা নিশ্চিত করুন।
যদি ব্যবহার করা হয় System.in
, আপনার প্রোগ্রামটি কেবল তখনই ইনপুট পায় যখন আপনার কমান্ড শেলটি এটি দেয় receives যদি আপনি ফাইল পুনঃনির্দেশ / পাইপ ব্যবহার করেন (যেমন কিছু ফাইল> জাভা মাইজাভা অ্যাপ্লিকেশন বা কিছু কম্যান্ড | জাভা মাই জাভা অ্যাপ), তবে ইনপুট ডেটা সাধারণত তত্ক্ষণাত হস্তান্তর করা হয়। তবে, আপনি যদি ম্যানুয়ালি ইনপুট টাইপ করেন তবে ডেটা হস্তান্তর বিলম্বিত হতে পারে। উদাহরণস্বরূপ উইন্ডোজ সেমিডি.এক্সি শেল সহ, ডেটাটি cmd.exe শেলের মধ্যে বাফার হয়। ডেটা কেবল চালানো জাভা প্রোগ্রামে ক্যারিজেস-রিটার্ন (কন্ট্রোল-এম বা <enter>
) এর পরে দেওয়া হয়। এটি কার্যকর করার পরিবেশের একটি সীমাবদ্ধতা। অবশ্যই, ইনপুট স্ট্রিম.ভ্যাভলয়েবল () যতক্ষণ শেল ডেটা বাফার করবে ততক্ষণ 0 আসবে - এটি সঠিক আচরণ; সেই সময়ে কোনও উপলভ্য ডেটা নেই। শেল থেকে ডেটা উপলভ্য হওয়ার সাথে সাথেই পদ্ধতিটি একটি মান> ০. এনবি দেয়: সাইগউইন সেমিডি ব্যবহার করে।
সর্বাধিক সমাধান (কোনও অবরুদ্ধকরণ নয়, তাই কোনও সময়সীমা প্রয়োজন নেই)
কেবল এটি ব্যবহার করুন:
byte[] inputData = new byte[1024];
int result = is.read(inputData, 0, is.available());
// result will indicate number of bytes read; -1 for EOF with no data read.
বা সমতুল্য,
BufferedReader br = new BufferedReader(new InputStreamReader(System.in, Charset.forName("ISO-8859-1")),1024);
// ...
// inside some iteration / processing logic:
if (br.ready()) {
int readCount = br.read(inputData, bufferOffset, inputData.length-bufferOffset);
}
রিচার সলিউশন (সময়সীমার মধ্যে সর্বাধিকভাবে বাফার পূরণ করে)
এটি ঘোষণা করুন:
public static int readInputStreamWithTimeout(InputStream is, byte[] b, int timeoutMillis)
throws IOException {
int bufferOffset = 0;
long maxTimeMillis = System.currentTimeMillis() + timeoutMillis;
while (System.currentTimeMillis() < maxTimeMillis && bufferOffset < b.length) {
int readLength = java.lang.Math.min(is.available(),b.length-bufferOffset);
// can alternatively use bufferedReader, guarded by isReady():
int readResult = is.read(b, bufferOffset, readLength);
if (readResult == -1) break;
bufferOffset += readResult;
}
return bufferOffset;
}
তারপরে এটি ব্যবহার করুন:
byte[] inputData = new byte[1024];
int readCount = readInputStreamWithTimeout(System.in, inputData, 6000); // 6 second timeout
// readCount will indicate number of bytes read; -1 for EOF with no data read.
is.available() > 1024
এই পরামর্শ ব্যর্থ হবে। এখানে অবশ্যই স্ট্রিম রয়েছে যা শূন্য ফিরে আসে। উদাহরণস্বরূপ SSLCocket সম্প্রতি পর্যন্ত। আপনি এই উপর নির্ভর করতে পারবেন না।