السابقالفهرسالتالي

الملحق B

الدخل والخرج في Java

 

B.1 كائنات System

يوفر صنف System عمليات وكائنات تحصل على المدخلات من لوحة المفاتيح، تطبع النص على الشاشة، وتقوم بالإدخال والإخراج من وإلى الملفات.

System.out هو الكائن الذي يطبع على الشاشة. عندما تستدعي العمليتين print وprintln، فأنت تستدعيهما على الكائن System.out.

يمكنك استخدام System.out لطباعة System.out:

System.out.println(System.out);
النتيجة هي:
[email protected]
عندما تطبع Java كائناً، فهي تطبع نوع الكائن –PrintStream– والحزمة التي عرّف فيها النوع –java.io– ومعرف فريد للكائن. كان المعرف على جهازي 80cc0e5، لكن لو شغلت نفس الشفرة على جهاز آخر فستحصل على نتيجة مختلفة.

يوجد أيضاً كائن اسمه System.in يجعل الإدخال من لوحة المفاتيح ممكناً. لسوء الحظ، هذا الكائن لا يجعل الإدخال من لوحة المفاتيح سهلاً.

B.2 الإدخال من لوحة المفاتيح

أولاً، علينا استخدام System.in لإنشاء InputStreamReader جديد.

InputStreamReader in = new InputStreamReader(System.in);
بعد ذلك استخدم in لإنشاء BufferedReader جديد:
BufferedReader keyboard = new BufferedReader(in);
أخيراً، يمكنك استدعاء readLine على keyboard، حتى تحصل على الدخل من لوحة المفاتيح وتحوله إلى سلسلة محرفية.
String s = keyboard.readLine();
System.out.println(s);
هذه مشكلة واحدة فقط. هناك أشياء يمكن أن تسير بشكل خاطئ عند استدعائك readLine، وقد تسبب IOException. العملية التي تسبب استثناء عليها تضمينه في نموذجها الأولي (prototype)، مثل هذه:
public static void main(String[] args) throws IOException {
    // body of main
}

B.3 الإدخال من ملف

هذا برنامج يقرأ سطوراً من ملف ويطبعها:

import java.io.*;

public class Words {

   public static void main(String[] args)
       throws FileNotFoundException, IOException {

      processFile("words.txt");
   }

   public static void processFile(String filename)
       throws FileNotFoundException, IOException {

      FileReader fileReader = new FileReader(filename);
      BufferedReader in = new BufferedReader(fileReader);

      while (true) {
         String s = in.readLine();
         if (s == null) break;
         System.out.println(s);
      }
   }
}
يستورد السطر الأول java.io، الحزمة التي تحتوي FileReader، BufferedReader وبقية سلسلة الأصناف الهرمية المعقدة التي تستخدمها Java لعمل أشياء شائعة وبسيطة. تعني * استيراد كافة الأصناف الموجودة في الحزمة.

إليك نفس البرنامج مكتوباً بلغة Python:

for word in open('words.txt'):
    print word
أنا لا أمزح. هذا هو البرنامج بالكامل، وهو يقوم بنفس الوظيفة.

B.4 القبض على الاستثناءات

في المثال السابق، يمكن للعملية processFile أن تسبب FileNotFoundException وIOException. ونظراً لأن main تستدعي processFile، فعليها التصريح عن نفس الاستثناءات. في برنامج أكبر من هذا، قد تصرح main عن كل الاستثناءات الموجودة في اللغة.

إن البديل لهذا هو القبض (catch) على الاستثناء بتعليمة try. هذا مثال عن كيفية عمل ذلك:

public static void main(String[] args) {

    try {
        processFile("words.txt");
    } catch(Exception ex) {
        System.out.println("That didn't work. Here's why:");
        ex.printStackTrace();
    }
}
البنية مشابهة لبنية تعليمة if. إذا اشتغل "الفرع" الأول بدون التسبب باستثناء، يتم تجاوز الفرع الثاني.

إذا تسبب الفرع الأول باستثناء، يقفز مسار التنفيذ إلى الفرع الثاني، الذي يحاول معالجة حالة الاستثناء (طريقة مهذبة لنقول "الخطأ"). في هذه الحالة سيطبع البرنامج رسالة خطأ بالإضافة إلى دليل المكدس (stack trace).

يمكنك تنزيل هذه الشفرة من http://thinklikecs.webs.com/resources/code/Words.java وقائمة الكلمات من http://thinklikecs.webs.com/resources/code/words.txt.

الآن اذهب وحل التمارين 8.9، 8.10، و8.11.

السابقالفهرسالتالي