لماذا العمل مع الملفات في Kotlin ليس مؤلماً
\n\nتخيل: أنت تكتب تطبيقاً يجب أن يحفظ إعدادات المستخدم، أو يسجل الأخطاء، أو يعالج ملفات CSV بآلاف الأسطر. في Java، هناك عشرات الفئات مثل BufferedReader و FileWriter وكتل try-catch لا نهائية. وماذا عن Kotlin؟ اللغة التي طورتها JetBrains لا "تبسط" Java فحسب، بل تعيد تصور العمل مع البيانات. هنا، تُفتح الملفات بسطر واحد، وتُعالج الأخطاء بأناقة.
في هذه المقالة، سنتناول العمل مع الملفات ونظام الملفات في Kotlin من العمليات الأساسية إلى التقنيات المتقدمة. ستتعلم كيفية قراءة وكتابة الملفات، وإدارة المجلدات، والعمل مع JSON و CSV، وتجنب الأخطاء الشائعة. هل أنت مستعد؟ هيا بنا!
\n\nالأساسيات: كيف يبسط Kotlin Java IO
\n\nالميزة الرئيسية في Kotlin هي دوال الامتداد (extension functions). بدلاً من كتابة عشرات الأسطر لقراءة ملف، تستخدم دالة واحدة مثل .readText() أو .readLines(). دعنا نلقي نظرة على أمثلة محددة.
قراءة الملف بالكامل
\nأبسط طريقة لقراءة ملف نصي هي استخدام readText(). هذه الدالة ترجع سلسلة نصية تحتوي على محتوى الملف. هام: سيتم إغلاق الملف تلقائياً بعد القراءة.
import java.io.File\n\nfun main() {\n val content = File("example.txt").readText()\n println(content)\n}\n\nإذا كان الملف كبيراً، فمن الأفضل قراءته سطراً سطراً:
\n\nval lines = File("example.txt").readLines()\nlines.forEach { line -> println(line) }\n\nوإذا كنت بحاجة للقراءة كتيار (على سبيل المثال، لمعالجة سجلات كبيرة):
\n\nFile("example.txt").useLines { lines ->\n lines.forEach { line ->\n // معالجة كل سطر\n println(line)\n }\n}\n\nلاحظ استخدام useLines() - وهي دالة تضمن إغلاق المورد بعد انتهاء الكتلة. تبدو سحرية، لكنها تعمل مثل try-with-resources في Java، ولكن بشكل أقصر.
الكتابة في ملف
\nالكتابة في Kotlin بديهية أيضاً. إليك ثلاثة خيارات:
\n\n// 1. استبدال محتوى الملف\nFile("output.txt").writeText("مرحباً، أيها العالم!")\n\n// 2. الإضافة إلى نهاية الملف\nFile("output.txt").appendText("سطر جديد\\n")\n\n// 3. كتابة قائمة من الأسطر\nval list = listOf("سطر1", "سطر2", "سطر3")\nFile("output.txt").writeText(list.joinToString("\\n"))\n\nبالمناسبة، إذا كنت تعمل مع بيانات ثنائية (صور، أرشيفات)، استخدم writeBytes() و readBytes():
val imageBytes = File("image.png").readBytes()\n// معالجة البايتات...\nFile("copy.png").writeBytes(imageBytes)\n\nإدارة نظام الملفات: إنشاء، حذف، نقل
\n\nKotlin لا يعيد اختراع العجلة، لكنه يجعل العمل مع نظام الملفات أكثر سهولة. جميع العمليات متاحة عبر الفئة java.io.File مع الإضافات.
إنشاء المجلدات
\nلإنشاء مجلد (وجميع المجلدات الأصلية إذا لم تكن موجودة):
\n\nval dir = File("data/logs/2024")\nval created = dir.mkdirs() // يرجع true إذا تم الإنشاء\nprintln("تم إنشاء المجلد: $created")\n\nلاحظ: mkdir() ينشئ المجلد الأخير فقط، بينما mkdirs() ينشئ السلسلة بأكملها.
التحقق من الوجود والحذف
\n\nval file = File("temp.txt")\nif (file.exists()) {\n if (file.delete()) {\n println("تم حذف الملف")\n } else {\n println("فشل الحذف")\n }\n}\n\n// حذف مجلد بشكل متكرر\nFile("data").deleteRecursively()\n\nكن حذراً مع deleteRecursively() - فهي عملية لا رجعة فيها. تحقق مرتين من أنك تحذف البيانات الصحيحة.
النقل والنسخ
\n\nval source = File("old.txt")\nval target = File("new_dir/new.txt")\n\n// النقل (إعادة