سؤال

كما أعرف، كما أن أكثر الطرق شيوعا لقراءة البيانات القائمة على الطابع من ملف في جافا تستخدم Scanner أو BufferedReader. وبعد أنا أعرف أيضا أن BufferedReader قراءة الملفات بكفاءة باستخدام مخزن مؤقت لتجنب عمليات القرص الفعلية. أسئلتي هي:

  • هل Scanner يؤدي كذلك BufferedReader?
  • لماذا تختار Scanner على BufferedReader أو العكس؟
هل كانت مفيدة؟

المحلول

Scanner يستخدم لتحليل الرموز من محتويات الدفق بينما BufferedReader فقط يقرأ الدفق ولا يفعل أي تحليل خاص.

في الواقع يمكنك اجتياز BufferedReader إلى أ scanner كمصدر للشخصيات لتحليل.

نصائح أخرى

في حاليا أحدث إصدار jdk6 / Build (B27)، Scanner لديه عجوز أصغر (1024 chars.) بدلا من BufferedReader (8192 حرف)، لكنها أكثر من كافية.

فيما يتعلق بالاختيار، استخدم Scanner أذا أردت بتحليل الملف، واستخدام BufferedReader أذا أردت اقرأ خط الملف حسب الخط. انظر أيضا النص التمهيدي لأوثائق API الخاصة بهم القديمة.

  • تفسير = تفسير المدخلات المعطاة ك Lokens (الأجزاء). من الممكن أن تعيدك إلى إعادتك إلى أجزاء محددة مباشرة كما int، سلسلة، عشرية، إلخ. انظر أيضا كل هؤلاء nextXxx() طرق في Scanner صف دراسي.
  • قراءة = البكم البكم إنه يحتفظ بإعادتك جميع الشخصيات، والتي بدورها يجب أن تفقد يدويا إذا كنت ترغب في مطابقة أو تؤكل شيئا مفيدا. ولكن إذا لم تكن بحاجة إلى القيام بذلك على أي حال، فالقراءة كافية.

انظر الى هذا حلقة الوصل, ، يتم نقل ما يلي من هناك:

يعد Bufferedreader فئة بسيطة تهدف إلى القراءة بكفاءة من تيار underling. بشكل عام، كل طلب القراءة المصنوع من قارئ مثل FileReader يؤدي إلى إعداد طلب قراءة مقاس للدفق الأساسي. يمكن أن يسبب كل استدعاء للقراءة () أو Readline () () بايت من الملفات، وتحويلها إلى أحرف، ثم إرجاعها، والتي يمكن أن تكون غير فعالة للغاية. تم تحسين الكفاءة بشكل ملحوظ إذا تم تشويه القارئ في مقدم مخزن مؤقت.

تتم مزامنة BufferedReader، لذلك يمكن لقراءة العمليات على مقدم Bufferedreader بأمان من مؤشرات ترابط متعددة.

الماسح الضوئي من ناحية أخرى لديه الكثير من الجبن المدمج فيه؛ يمكن أن تفعل كل ما يمكن أن يفعله المخزن المؤقت أو في نفس مستوى الكفاءة أيضا. ومع ذلك، بالإضافة إلى ذلك، يمكن للماسح الضوئي تحليل الدفق الأساسي لأنواع وسلسلة بدائية باستخدام تعبيرات منتظمة. يمكن أيضا تزيين الدفق الأساسي مع محدد من اختيارك. يمكن أن تفعل أيضا المسح الضوئي للأمام للدفق الأساسي تجاهل المحاسم!

الماسح الضوئي ومع ذلك ليس آمنا مؤلم، يجب مزامنة خارجيا.

يعتمد اختيار استخدام المخزن المؤقت أو الماسح الضوئي على التعليمات البرمجية التي تكتبها، إذا كنت تكتب قارئ قارئ مخزن للقارئ البسيط هو كافية. ومع ذلك، إذا كنت تكتب ماسح ضوئي محلل XML هو الخيار الأكثر طبيعية.

حتى أثناء قراءة المدخلات، إذا كنت ترغب في قبول خط إدخال المستخدم حسب الخط وأقول فقط إضافته إلى ملف، فعادة الفكر المؤقت جيدة بما فيه الكفاية. من ناحية أخرى إذا كنت ترغب في قبول إدخال المستخدم كأمر مع خيارات متعددة، ثم تنوي إجراء عمليات مختلفة بناء على الأمر والخيارات المحددة، سيناسب الماسح الضوئي بشكل أفضل.

  1. BufferedReader لديه ذاكرة عازلة أكبر بكثير من الماسح الضوئي. يستخدم BufferedReader إذا كنت ترغب في الحصول على سلاسل طويلة من دفق، واستخدام Scanner إذا كنت ترغب في تحليل نوع معين من الرمز المميز من دفق.

  2. Scanner يمكن استخدام الغمزة باستخدام محدد مخصص وتحليل الدفق في أنواع البيانات البدائية، في حين BufferedReader يمكن فقط قراءة وتخزين السلسلة.

  3. BufferedReader متزامن في حين Scanner ليس. يستخدم BufferedReader إذا كنت تعمل مع مؤشرات الترابط متعددة.

  4. Scanner يخفي IoException في حين BufferedReader يرميها على الفور.

أقترح استخدام BufferedReader لقراءة النص. Scanner الجلود IOException في حين BufferedReader يرميها على الفور.

الفرق بين bufferedreader. و الماسح الضوئي يتبعون:

  1. bufferedreader هو متزامنة لكن الماسح الضوئي هو لم تتم مزامنة.
  2. bufferedreader هو خيط آمن لكن الماسح الضوئي هو ليس خيط آمن.
  3. bufferedreader. لديه ذاكرة عازلة أكبر لكن الماسح الضوئي لديه ذاكرة عازلة أصغر.
  4. bufferedreader هو أسرع لكن الماسح الضوئي هو أبطأ في الإعدام.
  5. رمز لقراءة خط من وحدة التحكم:

    bufferedreader.:

     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();
    

فيما يلي الاختلافات بين BufferedReader والماسح الضوئي

  1. Bufferedreader فقط قراءة البيانات ولكن الماسح الضوئي أيضا تحليل البيانات.
  2. يمكنك فقط قراءة السلسلة باستخدام BufferedReader، ولكن يمكنك قراءة Int، طويل أو تعويم باستخدام الماسح الضوئي.
  3. BufferedReader أكبر من الماسح الضوئي، وهو موجود من JDK 1.1 أثناء إضافة الماسح الضوئي في إصدار JDK 5.
  4. حجم المخزن المؤقت لفريق Bufferedreader كبير (8 كيلو بايت) بالمقارنة مع 1KB من الماسح الضوئي.
  5. Bufferedreader هو أكثر ملاءمة لملف القراءة مع سلسلة طويلة أثناء الماسح الضوئي أكثر ملاءمة لقراءة إدخال المستخدم الصغير من موجه الأوامر.
  6. مزامنة Bufferedreader متزامنة ولكن الماسح الضوئي ليس كذلك، مما يعني أنه لا يمكنك مشاركة الماسح الضوئي بين مؤشرات الترابط متعددة.
  7. Bufferedreader أسرع من الماسح الضوئي لأنه لا يقضي الوقت في تحليل
  8. Bufferedreader أسرع قليلا بالمقارنة مع الماسح الضوئي
  9. Bufferedreader من حزمة Java.io والماسح الضوئي من حزمة Java.util على أساس النقاط التي يمكننا اختيار اختيارنا.

شكرا

الاختلافات الرئيسية:

  1. الماسح الضوئي

  • ماسحة نصية بسيطة يمكن أن تحليل الأنواع والسلاسل البدائية باستخدام تعبيرات منتظمة.
  • يكسر الماسح الضوئي مدخلاته في الرموز باستخدام نمط محدد، والذي يتطابق بشكل افتراضي Whitespace. يمكن بعد ذلك تحويل الرموز الناتجة إلى قيم أنواع مختلفة باستخدام الأساليب التالية المختلفة.

مثال

 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:

    • يقرأ النص من مجرى إدخال الأحرف وأحرف التخزين المؤقت لتوفير القراءة الفعالة للأحرف والصفائف والخطوط.

    • قد يتم تحديد حجم المخزن المؤقت، أو قد يتم استخدام الحجم الافتراضي. الافتراضي كبير بما يكفي لمعظم الأغراض.

بشكل عام، يؤدي كل طلب قراءة مصنوع من القارئ إلى إنشاء طلب القراءة المقابل للشخصية الأساسية أو بايت دفق. وبالتالي فمن المستحسن لفه مخزن مؤقت حول أي قارئ قد تكون عمليات قراءتها () مكلفة، مثل Filereaders and InputStreamReaders. علي سبيل المثال،

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

سوف تخزن المدخلات من الملف المحدد. بدون التخزين المؤقت، يمكن أن يسبب كل استدعاء من القراءة () أو Readline () بايتات بايت من الملف، وتحويلها إلى أحرف، ثم عاد، والتي يمكن أن تكون غير فعالة للغاية. يمكن ترجمة البرامج التي تستخدم datainputtreams للإدخال النصي من خلال استبدال كل datainputstream مع مقدم مخزن مؤقت مناسب.

مصدر:وصلة

هناك طرق مختلفة لأخذ المدخلات في Java مثل:

1) BufferedReader 2) الماسح 3) وسيطات سطر الأوامر

قراءة BufferedReader قراءة النص من دفق الإدخال ذات الطابع، وأحرف تخزين مؤقتا لتوفير القراءة الفعالة من الأحرف، الصفائف، والخطوط.

حيث الماسح الضوئي هو ماسح نصي بسيط يمكن أن تحليل الأنواع البدائية والسلاسل باستخدام تعبيرات منتظمة.

إذا كنت تكتب قارئ مخزن للقارئ بسيطة، فهو قارئ مؤقت. إذا كنت تكتب ماسح محلل XML هو الخيار الأكثر طبيعية.

لمزيد من المعلومات، يرجى الرجوع:

http://java.meritcampus.com/t/240/bufferedreader؟tc=mm69.

الجواب أدناه مأخوذ من قراءة من وحدة التحكم: Java Scanner VS BufferedReader

عند قراءة مدخلات من وحدة التحكم، هناك خياران موجودان لتحقيق ذلك. أولا باستخدام Scanner, ، آخر باستخدام BufferedReader. وبعد كلاهما لديه خصائص مختلفة. وهذا يعني الاختلافات كيفية استخدامه.

الماسح الضوئي المعالج بإدخال معين ك Token. BufferedReader فقط اقرأ الخط حسب الخط المعطى إدخال كسلسلة. الماسح الضوئي الذي توفره الذات إمكانات تحليل تماما مثل NEXTIT ()، nextFloat ().

ولكن، ما هي الاختلافات الأخرى بين؟

  • الماسح الضوئي المعالج بإدخال معين ك Token. Bufferedreader كخط دفق / سلسلة
  • تتلقى الماسح الضوئي المدخلات المعطاة باستخدام Regex. باستخدام BufferedReader يجب أن يكتب رمز إضافي
  • Bufferedreader أسرع من الماسح الضوئي * نقطة لا. 2.
  • الماسح الضوئي غير متزامن، ومزامنة Bufferedreader

الماسح الضوئي يأتي مع jdk الإصدار 1.5 أعلى.

متى يجب استخدام الماسح الضوئي، أو القارئ المخزن المؤقت؟

إلقاء نظرة على الاختلافات الرئيسية بين كل منهما، واحد باستخدام التمييز، والبعض الآخر باستخدام خط الدفق. عندما تحتاج إلى قدرات التحليل، استخدم الماسح الضوئي بدلا من ذلك. ولكن، أنا أكثر راحة مع العازلة. عندما تحتاج إلى القراءة من ملف، استخدم BufferedReader، لأنه يستخدم المخزن المؤقت عند قراءة ملف. أو يمكنك استخدام Bufferedreader كمدخل للماسح الضوئي.

  1. من المحتمل أن يعطيك Bufferedreader أداء أفضل (لأن الماسح الضوئي يعتمد على InputStreamReader، ومظهر مصادر). UPS، للقراءة من الملفات التي يستخدمها NIO. عندما قمت باختبار أداء NIO ضد أداء BufferedReader لملفات Big Files تظهر أداء أفضل قليلا.
  2. للقراءة من ملف جرب Apache Commons IO.

أنا أفضل Scanner لأنه لا يرمي استثناءات فحص وبالتالي فهو ينتج عن استخدام رمز أكثر تبسيطا.

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