التعامل مع الملفات في لغة الجافا
بسم الله الرحمن الرحيم
غالباً ما تحتاج البرامج إلى تبادل البيانات مع مصادر خارجية, سواء كان ذلك لإستقبال البيانات من مصدر ما أو لإرسال البيانات إلى مستقبل ما.
المرسل و المستقبل في عملية تبادل البيانات قد تكون لهم أشكال مختلفة أمثلة:
يمكن تبادل البيانات بين البرنامج و الملف, أو بين البرنامج و الشبكة, أو بين البرنامج و قاعدة بيانات, أو بين البرنامج و برنامج إلخ...
يمكن تبادل البيانات بين البرنامج و الملف, أو بين البرنامج و الشبكة, أو بين البرنامج و قاعدة بيانات, أو بين البرنامج و برنامج إلخ...
و بالنسبة لأنواع البيانات التي يمكن نقلها. يمكنك تبادل أي نوع من أنواع البيانات أمثلة:
نصوص, صور, ملفات صوتية, برامج, إلخ..
نصوص, صور, ملفات صوتية, برامج, إلخ..
لغة جافا توفر لك الحزمة java.io و التي تحتوي على جميع الكلاسات التي تحتاجها للتعامل مع الملفات, سواء لإدخال بيانات جديدة في الملف Input Operation أو لإستخراج بيانات موجودة في الملف Output Operation, و حتى لإنشاء أو حذف الملفات. و من هنا جاء الإسم I/O.
عملية إدخال البيانات أو إستخراجها من الملفات تسمى Streaming data, و هذه الكلمة تعني تدفق البيانات في اللغة العربية.
سميت هذه العملية ( تدفق البيانات ) لأنك عندما تتعامل مع الملفات سواء للقراءة أو الكتابة فأنت تقوم بذلك على دفعات صغيرة, بمعنى أنك تبرمج على سبيل المثال برنامج يفتح ملف معين و يقرأ منه حرف واحد أو مجموعة أحرف في كل دفعة حتى نقل كامل بيانات الملف. سترى ذلك لاحقاً بتفصيل.
Streams
الكلمة Streams تعني سلسلة من البيانات, يتم إستخراجها أو إدخالها في ملف معين.
هناك نوعين من الـ Streams و هما: input stream و output stream.
لذلك تم بناء الكلاسات التالية للتعامل مع الـ Streams:
- الكلاس InputStream يستخدم لقراءة البيانات من ملف معين يسمى Source.
- الكلاس OutputStream يستخدم لكتابة البيانات في ملف معين يسمى Destination.
في هذا الدرس سنشرح لك كيف تستخدم الحزمة I/O لقراءة أي نوع من الملفات و سنشرح فقط الكلاسات الأكثر استخداماً فيها.
طريقة التعامل مع الملفات
عندما تتعامل مع الملفات عليك إتباع نمط معين حتى تتجنب حدوث أي خطأ في البرنامج, و لقد قمنا بوضع خطوات ستساعدك كثيراً في فهم عملية نقل البيانات, و وضعنا أيضاً بعض الملاحظات التي يجب عليك الإنتباه لها أثناء تحديد مكان وجود الملفات التي سيتعامل البرنامج معها.
الخطوات التي يجب إتباعها لقراءة البيانات من ملف و كتابتها في ملف آخر
- إنشاء كائن يمثل الملف الذي تريد قراءة البيانات منه.
- إنشاء كائن يمثل الملف الذي تريد كتابة البيانات فيه.
- عليك وضع جميع الأوامر التي تتعامل مع الملفات بداخل الجملة try لأن البرنامج قد يتعرض لعدة مشاكل عندما يتعامل مع الملفات و التي سنذكرها لك لاحقاً.
- تحديد مسار و إسم و نوع الملف للكائن الذي يمثل الملف الذي سيتم قراءة البيانات منه.
- تحديد مسار و إسم و نوع الملف للكائن الذي يمثل الملف الذي سيتم كتابة البيانات فيه.
- تعريف متغير من النوع int.
- إستخدام حلقة بشكل متوازي بين الملفين, أي في كل دورة من دورات هذه الحلقة نقرأ حرف من الملف الأول و نضعه في الملف الثاني.
- إستخدام الدالة read() لقراءة حرف من الملف الأول, بعدها يجب تخزين هذا الحرف في المتغير.
- إستخدام الدالة write() لكتابة الحرف الموجود في المتغير في الملف الثاني.
- في الأخير عليك التأكد من إغلاق الملفات التي حاولت الإتصال معها سواء نجحت عملية النسخ أم لم تنجح, لذلك عليك إستدعاء الدالة close() في الجملة finally لإغلاق أي كائن متصل بالملفات حتى لا تعرض الملفات لأي خطر.
هذه الصورة توضح لك كيف تتم عملية نقل المحتوى من ملف لآخر, و هذا السيناريو هو نفسه تقريباً في جميع عمليات نقل البيانات و هو يستمر في نقل الأحرف الواحد تلو الآخر حتى آخر حرف موجود في الملف عندما نكتبه بالشكل الصحيح بداخل حلقة.
الدالة read() كما هو موضح في الصورة تقرأ حرف واحد من الملف و ترجعه كلما تم إستدعائها.
في حال تم قراءة جميع الأحرف الموجودة في الملف, ثم حاولت الدالة read() قرائة حرف من جديد, ستقوم بإرجاع 1-.
إذاً عندما ترجع الدالة read() القيمة 1- فهذا يعني أنه تم تخطي آخر حرف موجود في الملف.
من هنا جائت فكرة أنه يمكنك إستخدام الدالة read() و القيمة 1- كشرط أساسي لإيقاف عملية قرائة البيانات بعد آخر حرف يتم قرائته.
في حال تم قراءة جميع الأحرف الموجودة في الملف, ثم حاولت الدالة read() قرائة حرف من جديد, ستقوم بإرجاع 1-.
إذاً عندما ترجع الدالة read() القيمة 1- فهذا يعني أنه تم تخطي آخر حرف موجود في الملف.
من هنا جائت فكرة أنه يمكنك إستخدام الدالة read() و القيمة 1- كشرط أساسي لإيقاف عملية قرائة البيانات بعد آخر حرف يتم قرائته.
تحديد مسار الملفات التي تحاول التعامل معها
من الأشياء المهمة التي عليك الإنتباه لها عندما تتعامل مع الملفات هي معرفة كيف يتعامل نظام التشغيل الذي تبني برنامجك لأجله مع المسارات.
لنفترض أنه عندنا ملف موجود بداخل 3 مجلدات و نريد الوصول إليه كما في الصورة التالية:
الآن سترى كيف يتم تحديد المسار الموجود فيه الملف على أشهر أنظمة التشغيل.
- على نظامي Mac و Windows نضع \\ بعد إسم كل مجلد عند تحديد المسار الموجود فيه الملف test.
- على نظامي Unix و Linux نضع / بعد إسم كل مجلد عند تحديد المسار الموجود فيه الملف test.
لاحظ كيف أننا نضع نفس أسماء المجلدات و نفس إسم الملف لكي نصل للملف text. الإختلاف الوحيد هو الرمز الذي نضعه بعد كل مجلد.
- A\\B\\C\\test.txt // هكذا نصل للملف Mac و Windows على
- A/B/C/test.txt // هكذا نصل للملف Linux و Unix على
في جافا يمكنك إستخدام الأسلوب الذي تريده مهما كان نظام التشغيل, ثم تقوم بتحويل المسار عنك ليتناسب مع نظام التشغيل.