مقدمة في العمل مع نظام الملفات في Kotlin
العمل مع نظام الملفات هو إحدى المهام الأساسية عند تطوير التطبيقات بلغة Kotlin. سواء كان تطبيق وحدة تحكم، مشروع خادم، أو تطبيق جوال لنظام Android، فمن شبه المؤكد أنك ستحتاج إلى قراءة أو كتابة أو نقل أو حذف الملفات. Kotlin، كونه لغة حديثة تعمل فوق JVM، يوفر جميع إمكانيات المكتبة القياسية لـ Java، ولكنه يضيف إليها امتداداته المريحة والسكر النحوي الخاص به.
في هذه المقالة، سنشرح بالتفصيل كيفية العمل بكفاءة مع نظام الملفات في Kotlin. ستتعلم كيفية إنشاء وحذف الملفات والدلائل، قراءة وكتابة البيانات، اجتياز المجلدات ومعالجة الاستثناءات. جميع أمثلة الكود ستكون مكتوبة بلغة Kotlin النقية دون استخدام مكتبات خارجية.
الفئات الأساسية والمناهج
في Kotlin، يتم استخدام واجهتين برمجيتين رئيسيتين للعمل مع نظام الملفات:
- java.io.File — واجهة برمجية كلاسيكية من Java، والتي توسعها Kotlin بوظائفها الامتدادية.
- java.nio.file.Path و java.nio.file.Files — واجهة برمجية أكثر حداثة ووظيفية من Java NIO.
كلا المنهجين متوافقان تمامًا مع Kotlin، لكن الثاني (NIO) يُوصى به للمشاريع الجديدة، لأنه يوفر إمكانيات أكثر ثراءً وأداءً أفضل.
إنشاء الملفات والدلائل
لنبدأ بأبسط شيء — إنشاء ملف. في Kotlin، يتم ذلك بشكل موجز جدًا:
import java.io.File
fun main() { val file = File("example.txt") // إنشاء الملف (يعيد true إذا تم إنشاء الملف) val created = file.createNewFile() if (created) { println("تم إنشاء الملف: ${file.absolutePath}") } else { println("الملف موجود بالفعل") } // إنشاء دليل val dir = File("myDirectory") val dirCreated = dir.mkdir() // أو mkdirs() لإنشاء أدلة متداخلة println("تم إنشاء الدليل: $dirCreated")}لاحظ الطريقة mkdirs() — فهي ستنشئ جميع الأدلة الأصلية المفقودة، على عكس mkdir() الذي ينشئ فقط آخر دليل في المسار.
قراءة الملفات
توفر Kotlin امتدادات أنيقة لقراءة محتويات الملفات. دعنا نستعرض عدة طرق:
import java.io.File
fun readExamples() { val file = File("data.txt") // قراءة الملف بأكمله إلى سلسلة نصية val content: String = file.readText() println("محتوى الملف:$content") // قراءة سطرًا سطرًا إلى قائمة val lines: List<String> = file.readLines() lines.forEach { println("سطر: $it") } // قراءة جميع البايتات val bytes: ByteArray = file.readBytes() println("حجم الملف: ${bytes.size} بايت") // القراءة باستخدام Buffered (للملفات الكبيرة) file.forEachLine { line -> println("نقوم بمعالجة السطر: $line") }}بالنسبة للملفات الكبيرة، من الأفضل استخدام forEachLine أو bufferedReader()، حتى لا يتم تحميل الملف بأكمله في الذاكرة.
الكتابة في الملفات
كتابة البيانات إلى ملف بديهية أيضًا:
import java.io.File
fun writeExamples() { val file = File("output.txt") // كتابة سلسلة نصية (يستبدل محتوى الملف) file.writeText("مرحبًا، Kotlin!السطر الثاني") // الإضافة إلى نهاية الملف file.appendText("السطر الثالث (تمت إضافته)") // كتابة قائمة من السلاسل النصية val lines = listOf("السطر 1", "السطر 2", "السطر 3") file.writeText(lines.joinToString("")) // كتابة بايتات val data = byteArrayOf(72, 101, 108, 108, 111) // "Hello" في ASCII file.writeBytes(data)}إذا كنت بحاجة إلى تحكم أكبر (مثل تحديد الترميز)، استخدم