لا أحصل على النتيجة التي أتوقعها باستخدام readLine() في Java

StackOverflow https://stackoverflow.com/questions/25033

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أستخدم مقتطف الشفرة أدناه، ولكنه لا يعمل تمامًا كما أفهمه.

public static void main(String[] args) {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String line;
    try {
        line = br.readLine();
        while(line != null) {
            System.out.println(line);
            line = br.readLine();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

من قراءة Javadoc عنه readLine() انها تقول:

يقرأ سطرًا من النص.يعتبر الخط منتهيًا بواسطة أي من خلاصة الخط (\n)، حرف الإرجاع (\r)، أو حرف إرجاع متبوعًا مباشرة بتغذية سطر.

عائداتString تحتوي على محتويات السطر، ولا تتضمن أي أحرف نهاية السطر، أو فارغة إذا تم الوصول إلى نهاية الدفق

رميات: IOException - في حالة حدوث خطأ في الإدخال/الإخراج

ومن فهمي لهذا، readLine يجب أن يعود فارغًا في المرة الأولى التي لا يتم فيها إدخال أي إدخال بخلاف إنهاء السطر، مثل \r.ومع ذلك، ينتهي هذا الرمز بالتكرار إلى ما لا نهاية.بعد تصحيح الأخطاء، وجدت أنه بدلاً من إرجاع القيمة null عند إدخال حرف إنهاء فقط، فإنه يُرجع في الواقع سلسلة فارغة ("").هذا لا معنى له بالنسبة لي.ما الذي لا أفهمه بشكل صحيح؟

هل كانت مفيدة؟

المحلول

من خلال فهمي لهذا، يجب أن يُرجع readLine قيمة فارغة في المرة الأولى التي لا يتم فيها إدخال أي إدخال بخلاف إنهاء السطر، مثل ' '.

هذا ليس صحيحا. readLine سيعود null إذا تم الوصول إلى نهاية الدفق.أي، على سبيل المثال، إذا كنت تقرأ ملفًا، وينتهي الملف، أو إذا كنت تقرأ من مأخذ توصيل ويتم إغلاق المقبس.

ولكن إذا كنت تقرأ ببساطة مدخلات وحدة التحكم، فإن الضغط على مفتاح العودة على لوحة المفاتيح لا يشكل نهاية للبث.إنها مجرد شخصية تم إرجاعها (\n أو \r\n اعتمادًا على نظام التشغيل لديك).

لذلك، إذا كنت تريد الفصل بين كل من السلسلة الفارغة ونهاية السطر، فيجب عليك القيام بما يلي:

while (line != null && !line.equals(""))

بالإضافة إلى ذلك، يجب أن يعمل برنامجك الحالي كما هو متوقع إذا قمت بإدخال بعض الملفات مباشرة فيه، كما يلي:

java -cp . Echo < test.txt

نصائح أخرى

لا يوجد إدخال يختلف عن نهاية الدفق.يمكنك عادةً محاكاة نهاية الدفق في وحدة التحكم بالضغط على كنترول+د (AFAIK تستخدم بعض الأنظمة كنترول+ز بدلاً من).لكنني أعتقد أن هذا ليس ما تريده، لذا من الأفضل اختبار السلاسل الفارغة بالإضافة إلى السلاسل الفارغة.

هناك لطيفة أباتشي كومونز لانج مكتبة تحتوي على واجهة برمجة تطبيقات جيدة للإجراءات الشائعة :).يمكنك استخدام استيراد StringUtils بشكل ثابت واستخدام طريقته isNotEmpty(String ) للحصول على:

while(isNotEmpty(line)) {
    System.out.println(line);
    line = br.readLine();
}

قد يكون مفيدًا يومًا ما :) هناك أيضًا فئات أخرى مفيدة في هذا lib.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top