لماذا العمل مع الملفات في Java ليس مخيفًا؟
\n\nكل مطور، حتى لو كان يكتب فقط باك إند بلغة Java، عاجلاً أم آجلاً يواجه الحاجة لحفظ البيانات، أو قراءة إعدادات، أو معالجة سجل. العمل مع الملفات ونظام الملفات في Java هو مهارة أساسية تحول تطبيقات الكونسول "اللعبة" إلى أدوات حقيقية. ونعم، في عام 2024، لدينا ليس فقط File القديم الجيد، ولكن أيضًا java.nio.file القوي.
في هذه المقالة، سنشرح كل شيء: من فتح المفكرة إلى التلاعب بأذونات الوصول. هيا بنا!
\n\n1. النهج الكلاسيكي: java.io.File
\n\nلنبدأ بالجد. ظهرت فئة File في Java 1.0 وما زالت تُستخدم حتى الآن. لكن لنكن صادقين: إنها تتعلق بالبيانات الوصفية أكثر من المحتوى. يمكنك من خلالها التحقق مما إذا كان الملف موجودًا، إنشاء مجلد، الحصول على قائمة بالملفات.
import java.io.File;\n\npublic class FileExample {\n public static void main(String[] args) {\n File file = new File("/home/user/docs/notes.txt");\n \n System.out.println("الملف موجود: " + file.exists());\n System.out.println("المسار المطلق: " + file.getAbsolutePath());\n System.out.println("الحجم: " + file.length() + " بايت");\n \n // إنشاء دليل\n File dir = new File("/home/user/new_folder");\n if (dir.mkdir()) {\n System.out.println("تم إنشاء المجلد");\n }\n }\n}\n\nالعيب: File لا يستطيع قراءة الملفات الكبيرة بشكل صحيح - لهذا تحتاج إلى تدفقات. كما أنه لا يدعم الروابط الرمزية (soft links) بشكل افتراضي. ولهذا السبب أصدرت Sun (ثم Oracle) NIO.
2. قراءة الملفات: من InputStream إلى BufferedReader
\n\nالقراءة هي العملية الأكثر شيوعًا. إذا كان الملف نصيًا، استخدم BufferedReader - فهو يخزن البيانات مؤقتًا ويعمل بسرعة.
import java.io.BufferedReader;\nimport java.io.FileReader;\nimport java.io.IOException;\n\npublic class ReadFile {\n public static void main(String[] args) {\n try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {\n String line;\n while ((line = br.readLine()) != null) {\n System.out.println(line);\n }\n } catch (IOException e) {\n System.err.println("خطأ في القراءة: " + e.getMessage());\n }\n }\n}\n\nللملفات الثنائية (صور، أرشيفات) استخدم FileInputStream:
import java.io.FileInputStream;\nimport java.io.IOException;\n\npublic class ReadBinary {\n public static void main(String[] args) {\n try (FileInputStream fis = new FileInputStream("image.png")) {\n byte[] buffer = new byte[1024];\n int bytesRead;\n while ((bytesRead = fis.read(buffer)) != -1) {\n // معالجة الجزء buffer[0..bytesRead]\n }\n } catch (IOException e) {\n e.printStackTrace();\n }\n }\n}\n\nهام: استخدم دائمًا try-with-resources - فهذا يضمن إغلاق التدفق، حتى في حالة حدوث استثناء.
3. الكتابة إلى ملف: BufferedWriter و FileOutputStream
\n\nالكتابة شبه متماثلة مع القراءة. للنصوص - BufferedWriter، للبيانات الثنائية - FileOutputStream.
import java.io.BufferedWriter;\nimport java.io.FileWriter;\nimport java.io.IOException;\n\npublic class WriteFile {\n public static void main(String[] args) {\n try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {\n bw.write("مرحبًا، أيها العالم!");\n bw.newLine();\n bw.write("Java قوية.");\n } catch (IOException e) {\n e.printStackTrace();\n }\n }\n}\n\nإذا كنت بحاجة إلى الإضافة إلى نهاية الملف بدلاً من الكتابة فوقه