أهم وظيفة للكمبيوتر هي معالجة البيانات. تحتاج لغة الكمبيوتر المفيدة إلى قدرات إدخال/إخراج جيدة حتى تتدفق البيانات غير المعالجة إلى البرنامج وتتدفق البيانات المعالجة إلى الخارج.
بالمقارنة مع اللغات الأخرى، تعد وظائف الإدخال والإخراج في Java معقدة. في لغات أخرى، يتم تغليف العديد من وظائف الإدخال والإخراج (مثل قراءة الملفات) ويمكن تنفيذها باستخدام سطر واحد أو سطرين من البرامج. في Java، يحتاج المبرمجون غالبًا إلى مستويات متعددة من الزخرفة لتحقيق قراءة الملف.
فائدة التعقيد النسبي هي مرونة IO. في Java، يمكن للمبرمجين التحكم في عملية الإدخال/الإخراج بأكملها لتصميم أفضل طريقة للإدخال/الإخراج. سنرى المزيد أدناه.
مثال على الإدخال والإخراج
يوجد أدناه الملف file.txt الذي استخدمته للعرض التوضيحي
أهلاً بالعالم! أهلاً بالطالب الذي يذاكر كثيرا!
لندرس أولاً مثالاً لقراءة الملف:
import java.io.*;public class Test{ public static void main(String[] args) {try { BufferedReader br = new BufferedReader(new FileReader("file.txt")); String line = br.readLine(); while (line != null) { System.out.println(line); e) { System.out.println("مشكلة الإدخال والإخراج" } }}
يحتوي هذا البرنامج على معالج الاستثناءات محاولة...التقاط...أخيرًا. يرجى الرجوع إلى برنامج Java التعليمي المتقدم حول معالجة الاستثناءات
الديكور ومجموعات الوظائف
مفتاح برنامج IO هو إنشاء كائن BufferedReader br:
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
أثناء عملية الإنشاء، قمنا أولاً بإنشاء كائن FileReader، وتتمثل وظيفة هذا الكائن في قراءة تدفق البايت من الملف "file.txt" وتحويله إلى تدفق نصي. في Java، ترميز النص القياسي هو Unicode. يتلقى BufferedReader() كائن FileReader، ويوسع وظائف FileReader، وينشئ كائن BufferedReader جديد. بالإضافة إلى وظائف قراءة وتحويل الملفات المذكورة أعلاه، يوفر هذا الكائن أيضًا وظائف القراءة المخزنة مؤقتًا (مخزنة مؤقتًا). أخيرًا، يمكننا قراءة الملف سطرًا تلو الآخر عن طريق استدعاء التابع readLine() على الكائن br.
(قراءة ذاكرة التخزين المؤقت هي فتح منطقة في الذاكرة كذاكرة تخزين مؤقت، والتي تخزن دفق النص الذي تمت قراءته بواسطة FileReader. عند قراءة محتوى ذاكرة التخزين المؤقت (مثل أمر readLine())، ستقوم ذاكرة التخزين المؤقت بتحميل دفق النص التالي.)
BufferedReader () هو مصمم يستقبل كائنًا بدائيًا ويعيد كائنًا مزخرفًا بوظائف أكثر تعقيدًا. فائدة الديكور هي أنه يمكن استخدامها لتزيين أشياء مختلفة. ما نقوم بتعديله هنا هو تدفق النص المقروء من الملف. يمكن تعديل تدفقات النص الأخرى، مثل الإدخال القياسي، وتدفقات نقل الشبكة، وما إلى ذلك، بواسطة BufferedReader() لتحقيق القراءة المخزنة مؤقتًا.
يوضح الرسم البياني أدناه كيفية عمل br، مع تدفق البيانات من الأسفل إلى الأعلى:
عملية الزخرفة المذكورة أعلاه تشبه إلى حد كبير فكرة دفق النص في Linux. في Linux، نستخدم أسلوبًا يشبه الوظيفة لمعالجة وتمرير تدفقات النص. في جافا، نستخدم الديكور. لكن أغراضها متشابهة، وهي تحقيق النمطية والجمع الحر للوظائف.
المزيد من المجموعات
في الواقع، توفر Java مجموعة غنية من أدوات الديكور. يجمع FileReader بين خطوتين القراءة والتحويل، ويعتمد الإعدادات الافتراضية شائعة الاستخدام، مثل unicode للتشفير. يمكننا استخدام مجموعة FileInputStream + InputStreamReader لاستبدال FileReader، وبالتالي فصل خطوتين قراءة البايتات والتحويل، والحصول على تحكم أفضل في العمليتين.
(بالطبع، يعد FileReader أكثر ملاءمة للاستخدام. يقوم InputStreamReader بتحويل FileInputStream إلى قارئ لمعالجة نص Unicode)
تشير الأسهم إلى اتجاه تدفق البيانات
تأتي قراءة وكتابة الدفق من أربع فئات أساسية: InputStream وOutputStream وReader وWriter. يتعامل كل من InputStream وReader مع عمليات القراءة، ويتعامل OutputStream وWriter مع عمليات الكتابة. كلاهما موجود في حزمة Java.io. علاقة الميراث هي كما يلي:
java.io
بالإضافة إلى ذلك، يحتوي IOException على الفئات المشتقة التالية:
IOEException
يتعامل القارئ والكاتب والفئات المشتقة منهما مع نص Unicode. كما نرى Buffered Reader أو InputStreamReader أو FileReader.
يتعامل كل من InputStream وOutputStream والفئات المشتقة منهما مع تدفقات البايت. يمكن اعتبار البيانات الموجودة في الكمبيوتر في شكل بايت، لذلك يمكن استخدام InputStream وOutputStream لمعالجة نطاق أوسع من البيانات. على سبيل المثال، يمكننا استخدام المجموعة التالية لقراءة البيانات (مثل الأعداد الصحيحة) الموجودة في الملف المضغوط:
تشير الأسهم إلى اتجاه تدفق البيانات
نقرأ تدفق البايت من الملف المضغوط، ثم نفك ضغطه، ونقرأ البيانات في النهاية.
يكتب
عمليات الكتابة تشبه عمليات القراءة. يمكننا تنفيذ وظائف الكتابة المعقدة باستخدام الزخارف. فيما يلي مثال بسيط لكتابة النص:
import java.io.*;public class Test{ public static void main(String[] args) { حاول { محتوى السلسلة = "شكرًا لك على سمكتك."; ملف جديد ("new.txt"); / أنشئ الملف إذا لم يكن موجودًا if (!file.exists()) { file.createNewFile() } FileWriter fw = new FileWriter(file.getAbsoluteFile()); BufferedWriter bw = new BufferedWriter(fw); bw.write(content); bw.cloud(); } Catch(IOException e) { System.out.println("مشكلة IO" } });
تم إنشاء كائن الملف أعلاه لمعالجة مسارات الملفات.
تلخيص
هذه مجرد مقدمة أساسية لـ Java IO. يعد الإدخال/الإخراج في Java معقدًا نسبيًا. يحتاج مبرمجو Java إلى قضاء بعض الوقت في التعرف على الفئات الموجودة في java.io ووظائفها.