File IO
عمليات الملفات هي ميزة مهمة في البرامج. في هذا الدرس، سنتعلم IO الملفات في Java.
فئة File
فئة File تُستخدم للعمل مع الملفات والمجلدات.
إنشاء كائنات File
JAVA
import java.io.File;
// الطريقة 1: نص المسار
File file1 = new File("test.txt");
// الطريقة 2: المسار الأب + اسم الملف
File file2 = new File("/home/user", "test.txt");
// الطريقة 3: كائن File + اسم الملف
File dir = new File("/home/user");
File file3 = new File(dir, "test.txt");
الدوال الشائعة
| الدالة | الوصف |
|---|---|
exists() |
هل يوجد |
isFile() |
هل هو ملف |
isDirectory() |
هل هو مجلد |
getName() |
اسم الملف |
getPath() |
المسار |
getAbsolutePath() |
المسار المطلق |
length() |
الحجم (بايت) |
createNewFile() |
إنشاء ملف |
mkdir() |
إنشاء مجلد |
mkdirs() |
إنشاء مجلدات متداخلة |
delete() |
حذف |
list() |
قائمة محتويات المجلد |
مثال: عمليات الملفات
JAVA
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) throws IOException {
File file = new File("test.txt");
// إنشاء ملف
if (!file.exists()) {
file.createNewFile();
System.out.println("تم إنشاء الملف بنجاح");
}
// معلومات الملف
System.out.println("الاسم: " + file.getName());
System.out.println("المسار: " + file.getPath());
System.out.println("المسار المطلق: " + file.getAbsolutePath());
System.out.println("الحجم: " + file.length() + " بايت");
System.out.println("هل هو ملف: " + file.isFile());
System.out.println("هل هو مجلد: " + file.isDirectory());
// حذف الملف
// file.delete();
}
}
مثال: عمليات المجلدات
JAVA
import java.io.File;
public class DirectoryDemo {
public static void main(String[] args) {
// إنشاء مجلد
File dir = new File("testdir/subdir");
dir.mkdirs();
System.out.println("تم إنشاء المجلد: " + dir.getAbsolutePath());
// قائمة المحتويات
File parent = new File("testdir");
String[] files = parent.list();
if (files != null) {
for (String name : files) {
System.out.println(" " + name);
}
}
// استعراض المجلد
File[] fileArray = parent.listFiles();
if (fileArray != null) {
for (File f : fileArray) {
String type = f.isDirectory() ? "[مجلد]" : "[ملف]";
System.out.println(type + " " + f.getName());
}
}
}
}
قراءة/كتابة الملفات
BufferedReader لقراءة الملف
JAVA
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFile {
public static void main(String[] args) {
// try-with-resources يغلق الموارد تلقائيًا
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println("خطأ في القراءة: " + e.getMessage());
}
}
}
BufferedWriter لكتابة الملف
JAVA
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class WriteFile {
public static void main(String[] args) {
// الكتابة (تخطي)
try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
writer.write("مرحباً بالعالم!");
writer.newLine();
writer.write("عمليات ملفات Java");
System.out.println("الكتابة ناجحة");
} catch (IOException e) {
System.out.println("خطأ في الكتابة: " + e.getMessage());
}
// الإضافة
try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt", true))) {
writer.write("محتوى مضاف");
writer.newLine();
System.out.println("الإضافة ناجحة");
} catch (IOException e) {
System.out.println("خطأ في الإضافة: " + e.getMessage());
}
}
}
try-with-resources
تم تقديمها في Java 7، تغلق الموارد تلقائيًا.
الصيغة
JAVA
try (نوع_الموارد متغير = new المورد()) {
// استخدام المورد
} catch (نوع_الاستثناء e) {
// معالجة الاستثناء
}
مثال: نسخ الملف
JAVA
import java.io.*;
public class FileCopy {
public static void copy(String src, String dest) throws IOException {
try (BufferedReader reader = new BufferedReader(new FileReader(src));
BufferedWriter writer = new BufferedWriter(new FileWriter(dest))) {
String line;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine();
}
}
System.out.println("النسخ مكتمل");
}
public static void main(String[] args) {
try {
copy("source.txt", "dest.txt");
} catch (IOException e) {
System.out.println("خطأ في النسخ: " + e.getMessage());
}
}
}
قراءة كل المحتوى
الطريقة 1: سطر بسطر
JAVA
public static String readAll(String filename) throws IOException {
StringBuilder sb = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
String line;
while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}
}
return sb.toString();
}
الطريقة 2: فئة Files (Java 7+)
JAVA
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;
public class FilesDemo {
public static void main(String[] args) throws IOException {
// قراءة جميع الأسطر
List<String> lines = Files.readAllLines(Paths.get("test.txt"));
lines.forEach(System.out::println);
// قراءة كنص
String content = new String(Files.readAllBytes(Paths.get("test.txt")));
System.out.println(content);
// كتابة ملف
Files.write(Paths.get("output.txt"), "مرحباً".getBytes());
}
}
استعراض الملفات
قائمة المجلدات بشكل متكرر
JAVA
import java.io.File;
public class ListFiles {
public static void listFiles(File dir, String indent) {
File[] files = dir.listFiles();
if (files == null) return;
for (File file : files) {
System.out.println(indent + file.getName());
if (file.isDirectory()) {
listFiles(file, indent + " ");
}
}
}
public static void main(String[] args) {
File dir = new File(".");
listFiles(dir, "");
}
}
تصفية الملفات
JAVA
import java.io.File;
import java.io.FilenameFilter;
public class FileFilter {
public static void main(String[] args) {
File dir = new File(".");
// عرض ملفات .txt فقط
String[] txtFiles = dir.list((d, name) -> name.endsWith(".txt"));
if (txtFiles != null) {
for (String name : txtFiles) {
System.out.println(name);
}
}
// عرض المجلدات فقط
File[] dirs = dir.listFiles(File::isDirectory);
if (dirs != null) {
for (File d : dirs) {
System.out.println("[مجلد] " + d.getName());
}
}
}
}
التسلسل (Serialization)
تحويل الكائنات إلى تيار بايتات لحفظها في ملفات أو إرسالها عبر الشبكة.
متطلبات التسلسل
- يجب أن تطبق الفئة واجهة
Serializable - جميع الحقول يجب أن تكون قابلة للتسلسل
مثال: التسلسل
JAVA
import java.io.*;
// فئة قابلة للتسلسل
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
private transient String password; // يستثنى من التسلسل
public User(String name, int age, String password) {
this.name = name;
this.age = age;
this.password = password;
}
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + ", password='" + password + "'}";
}
}
public class SerializeDemo {
public static void main(String[] args) {
// تسلسل
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.dat"))) {
User user = new User("أحمد", 25، "123456");
oos.writeObject(user);
System.out.println("التسلسل ناجح");
} catch (IOException e) {
System.out.println("خطأ في التسلسل: " + e.getMessage());
}
// إلغاء التسلسل
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.dat"))) {
User user = (User) ois.readObject();
System.out.println("تم إلغاء التسلسل: " + user);
// User{name='أحمد', age=25, password='null'} (ال密码 مستبعدة)
} catch (IOException | ClassNotFoundException e) {
System.out.println("خطأ في إلغاء التسلسل: " + e.getMessage());
}
}
}
❓ أسئلة شائعة
س ما الفرق بين المسارات النسبية والمطلقة؟
ج المسارات النسبية تبدأ من دليل العمل الحالي. المطلقة تبدأ من الجذر.
س لماذا نستخدم try-with-resources؟
ج تغلق الموارد تلقائيًا، مما يمنع تسرب الموارد.
س ماذا تفعل كلمة transient؟
ج تحدد الحقول التي لا تشارك في التسلسل.
📖 ملخص
- فئة File تعمل مع الملفات والمجلدات
- BufferedReader/BufferedWriter لقراءة/كتابة الملفات
- try-with-resources تغلق الموارد تلقائيًا
- فئة Files تبسط عمليات الملفات
- التسلسل يحفظ الكائنات في ملفات
📝 تمارين
- إحصائيات: اعدد الأسطر والكلمات والأحرف في ملف
- نسخ: نفذ نسخ ملف مع دعم الملفات الكبيرة
- استعراض: استعرض جميع الملفات في مجلد بشكل متكرر
الدرس التالي
في الدرس التالي، سنتعلم Streams و NIO — IO القائم على التيارات.



