المدخلات والمخرجات بلغة الجافا

المدخلات والمخرجات:

لنجعل برامجنا أكثر إثارة للاهتمام، ونحن نريد قبول المدخلات
و تنسيق مخرجات البرنامج بشكل صحيح. وبطبيعة الحال فإن استخدام البرامج الحديثة كواجهة المستخدم الرسومية(GUI) لجمع مدخلات المستخدم. ومع ذلك فإن برمجة مثل تلك المدخلات تتطلب المزيد من الأدوات والتقنيات
أكثر مما لدينا في الوقت الحالي. لأن المطلوب الأول من العمل هوأن يصبح المبرمج أكثر دراية واعتيادية مع لغة البرمجة جافا، ونحن سنبدأ بتغطية المدخلات والمخرجات في الوقت الراهن.

قراءة الإدخال:
 
أنه من السهل طباعة المخرجات إلى نافذة وحدة التحكم فقط عن طريق استخدام System.out.println ولكن القراءة المدخلات ليست بهذه البساطة. ولقراءة مدخلات وحدة التحكم، عليك أولا بناء Scanner الذي هومرتبط بالنظام الداخلي. ونستطيع استخدام الكثير من الدوال الموجودة في فئه rScanne لقراءة المدخلات

 ومثال على ذلك متغير nextLine لقراءة سطر من المدخلات
;("?System.out.print ("What is your name
;()String name = in.nextLine

لان المدخل قد يحتوي على بعض المسافات ولقراءته كسطر نستخدم متغير nextLine ولقراءة المدخل ككلمه واحده نستخدم داله
in.next();

مثال على ذلك
;()String firstName = in.next

 
استخدم داله nextInt لإدخال عدد صحيح مثال على ذلك
;("?System.out.print("How old are you
;()int age = in.nextInt

استخدم داله nextDouble لإدخال عدد عشري

و لابد من ايراد
import java.util.Scanner;

في بدايه البرنامج فئه Scanner معرفه في حزمهjava. util ، وفي حال استخدام هذا الصنف لابد من استخدام import
 

ملاحظه:
فئه Scanner ليست مناسبة لقراءة كلمة السر من وحدة التحكم حيث إن المدخلات تكون ظاهره للجميع، لغة الجافا SE 6 قدمت فئه console خصيصاً لهذا الغرض، لقراءة كلمه السر استخدم التعليمات البرمجية التاليه:

;()Console cons = System.console
;("String username = cons.readLine("User name
;("char[] passwd = cons.readPassword("Password

ولأسباب أمنية، يتم إرجاع كلمة المرور في المصفوفه المكونه من مجموعة من الأحرف بدلا من السلسلة من الاحرف (String)، بعد الانتهاء من تجهيز كلمة السر، يجب عليك استبدال المصفوفه على الفور بأي رقم تريده. ولعل معالجة المدخلات مع أيقونة وحدة التحكم ليست مريحة كما هو الحال مع Scanner، إذ يمكنك فقط قراءة سطر واحد من المدخلات في كل مرة. ولا توجد طرق لقراءة الكلمات الفردية أو الأرقام.

java.util.Scanner :

•	(Scanner(InputStream in
يبني كائن من Scanner

 
• ()String nextLine
يقرأ السطر التالي من المدخلات

•()String next
يقرأ الكلمة الأولى من المدخلات

• ()int nextInt و ()double nextDouble
يقرأ ويحول تسلسل الأحرف المتتابع الذي يمثل في أعداد صحيحه أو أعداد عشريه

• ()boolean hasNext
 يختبر وجود كلمه آخرى في المدخلات

• ()boolean hasNextInt و ()boolean hasNextDouble
يختبر تسلسل الأحرف هل يمثل أعداد صحيحه أو أعداد عشريه

 java.lang.System

• static Console console()

عائد كائن Console يتفاعل مع المستخدم باستخدام console window إذا كان التفاعل ممكن، كائن Console يتوفر لأي برنامج يتم تشغيله عن طريق console window ، اما غير ذلك، فتوفره يعتمد على النظام المستخدم

 : java.io.Console

• (static char[] readPassword(String prompt, Object... args
• (static String readLine(String prompt, Object... arg
يعرض جمله تحث المستخدم على ادخال معلوماته مثل
 "what is your name"
و يأخذ المدخلات من المستخدم، معاملات args تستخدم لتنسيق المخرجات

تنسيق المخرجات
يمكنك طباعة عدد X إلى وحدة التحكم (System.out.print). ومع هذا الأمر
تستطبع طباعة أكبر عدد ممكن وبأي عدد غير الصفر لهذا النوع. وعلى سبيل المثال

double x = 10000.0 / 3.0
(System.out.print(x
المخرج:
3333.3333333333335

وتلك النقطة تعتبر مشكلة إذا كنت ترغب في عرض فئة الدولار والسنت، ففي الإصدارات القديمة من الجافا كان تنسيق الأرقام متعبا. ولحسن الحظ فإن نسخة الجافا 5.0 SE اعادت طريقة printf الموجوده في مكتبة C على سبيل المثال
 
 ;(System.out.printf("%8.2f", x

يمكن طباعة X مع عرض ثمانية أحرف ودقة حرفان.
المخرج:
3333.33

ويمكنك توفير معاملات متعددة ل printf على سبيل المثال:
 ; ("Hello, %s. Next year, you'll be %d", name, age)

كل من التنسيقات اللتي تبدأ ب (%a)يتم استبدالها مع المعاملات المناسبة. طابع التحويل يحدد القيمة المراد تحويلها على النحو التالي:
f: عدد عشري، s: نص، d عدد صحيح:
جدول 5-3 (التحويلات)

بالاضافه إلى ذلك يمكنك تحديد علامه معينه للتحكم في مظهر المخرجات جدول 6-3 يستعرض ذلك على سبيل المثال يمكننا استخدام الفاصله على النحو التالي:
 System.out.printf("%,.2f", 10000.0 / 3.0);
ذلك سيطبع
3,333.33

ملاحظة: يمكنك استخدام التحويلات لتنسيق الكائنات إذا طبق الكائن formattable interface ، من ثم يتم استدعاء داله format غير ذلك يتم استدعاء دالة toString لتقوم بتحويل الكائن إلى String حيث سيتم مناقشته في الفصل الخامس، السادس
 Flags for printf جدول 6-3:

نستطيع استخدام داله String format لانشاء تنسيقات خاصه بالنصوص بدون طباعتها
String message = String.format("Hello, %s. Next year, you'll be %d", name, age);
على الرغم من أننا لم ندخل في تفاصيل Data type حيث اننا سنتحدث عنها في الفصل الرابع، ولكن سوف نناقش هنا بعض تنسيقات الوقت والتاريخ بالعادة نقوم باستخدام حرفين للتنسيق يبدأ من t وينتهي بأحد حروف جدول 7-3 على سبيل المثال:
System.out.printf("%tc", new Date());
يقوم بطباعه الوقت والتاريخ بالتنسيق التالي
Mon Feb 09 18:05:19 PST 2004

جدول 7-3 تحويلات الوقت والتاريخ

كما ترون في الجدول 3-7، وبعض من الأشكال لا تشير إلا لجزء من تاريخ معين، على سبيل المثال، فقط يوم أو مجرد شهر. سيكون من المزعج بعض الشيء تزويد التاريخ عدة مرات والقيام بتنسيق كل جزء. لهذا السبب، سلسلة تنسيق (format string) يمكن أن تشير إلى مؤشر المعطى ليكون مهيأ. هذا المؤشر يجب أن يتبع ب ٪، ويجب أن يتم إنهاؤه عن طريق $. على سبيل المثال،
System.out.printf("%1$s %2$tB %2$te, %2$tY", "Due date:", new Date());
 
مطبوعات
تاريخ الاستحقاق: 9 فبراير 2004
بدلا من ذلك، يمكنك استخدام <(flag). فإنه يشير إلى أن نفس المعامل الذي تم تنسيقه سابقا سيتم استخدامه مجددا
 وهذا هو، البيان
System.out.printf("%s %tB %<te, %<tY", "Due date:", new Date());
تعطي نفس الناتج كما في البيان السابق.
تنبيه: قيم مؤشر المعطى تبدأ 1، وليس ب 0:٪ 1 $ ... تنسيقات المعطى الأولى.
 هذا يتجنب الخلط بينها وبين (flag) 0 .

ملاحظة: عدد من قواعد التنسيق محددة. على سبيل المثال، في ألمانيا، والفاصل العشري هي (period) وليست فاصلة، ويتم تنسيق يوم الاثنين كمونتاج. سترى في المجلد الثاني كيفية التحكم في السلوك للتطبيقات الخاصة بك.
مدخلات الملف ومخرجاته
القراءة من ملف،
 وبناء الكائن Scanner من خلال الكائن File،
 على سبيل المثال:- 
 Scanner in = new Scanner(new File("myfile.txt"));
إذا كان اسم الملف يحتوي على backslashes ، تذكر أن يفصل كل واحد منهم باضافة backslashes اخر:
 "c:\\mydirectory\\myfile.txt".

الآن يمكنك القراءة من الملف، وذلك باستخدام أي من دوال scanner التي تم وصفها سابقاً.
الكتابة إلى ملف،
 وبناء الكائن PrintWriter. 
ويجب كتابة اسم الملف دخل construct
PrintWriter out = new PrintWriter("myfile.txt");

إذا لم يكن الملف موجودا، يمكنك ببساطة استخدام إحدى الأوامر print، println، printf كما فعلته عند الطباعة System.out.

تنبيه: يمكنك بناء داله Scanner مع سلسة من parameter ، ولكن يفسرScanner سلسلة مثل البيانات، وليس اسم الملف. على سبيل المثال، عند نداء
Scanner in = new Scanner("myfile.txt"); // ERROR?
ثم scanner ستشهد عشرة أحرف من البيانات: m,y,f'، الخ. ربما كان هذا هو ليس المقصود في هذه الحالة.
ملاحظة: عند تحديد اسم ملف نسبي، مثل
"myfile.txt", "mydirectory/myfile.txt", or "../myfile.txt",
يتم وضع الملف نسبة إلى دليل الجافا الافتراضية
إذا كنت أطلقت البرنامج من ايقونه الأوامر، من خلال تنفيذ
 JAVA MyProg 
ثم بداية directory هو directory الحالي لايقونه الأوامر. ومع ذلك، إذا كنت تستخدم بيئة تطوير متكاملة، يتم التحكم بالمسار بدءا من IDE.و يمكنك العثور على مسار الموقع عن طريق:-
String dir = System.getProperty("user.dir");
إذا قمت بتشغيلgrief مع تحديد موقع الملفات، استخدام اسم مسار الجذري (absolute path names) للملف مثل
"c:\\mydirectory\\myfile.txt" or "/home/me/mydirectory/myfile.txt".

كما رأيتم فقط، يمكنك الوصول إلى الملفات بنفس السهولة التي يمكنك استخدامها System.in وSystem.out.
هناك catch واحد فقط: إذا قمت ببناء scanner مع ملف غير موجود أو Print-
اسم الملف الذي لا يمكن أن ينشأ، يحدث استثناء
يرى compiler java هذه الاستثناءات أن تكون أكثر خطورة من استثناء«القسمة على صفر»، على سبيل المثال.
في الفصل الحادي عشر سوف تتعلم طرق مختلفة لمعالجة الاستثناءات. أما الآن يجب أن يكون بإمكانك اعلام compiler java إن كنت على بينه من إمكانية إنشاء استثناء «لم يتم العثور على الملف». يمكنك القيام بذلك بوضع علامات في main method مع شرط رميه، ومن امثلة ذلك:
public static void main(String[] args) throws FileNotFoundException {
Scanner in = new Scanner(new File("myfile.txt"));
... }

انظر أيضا 
 الجمل الشرطية

مصادر 

برمجة
جافا (لغة برمجة)