العودة إلى الدورة

تدفقات الإدخال والإخراج (تدفقات البايت مقابل تدفقات الأحرف)

إتقان لغة Java: من الصفر إلى مطور محترف (رحلة من 50 درساً)

الدرس 44: تدفقات الإدخال والإخراج

يعتمد نظام I/O في Java على مفهوم التدفقات (Streams)، التي تمثل تسلسلاً من البيانات يتدفق من مصدر (تدفق إدخال) إلى وجهة (تدفق إخراج).

1. تدفقات البايت (Byte Streams)

  • تتعامل مع البيانات الثنائية الخام (مثل الصور، الصوت، الكائنات المتسلسلة).
  • الفئات الأساسية: InputStream و OutputStream.
  • الفئات الملموسة: FileInputStream, FileOutputStream.

java try (InputStream input = new FileInputStream("source.dat"); OutputStream output = new FileOutputStream("target.dat")) {

int data; 
while ((data = input.read()) != -1) { // يقرأ بايت واحد
    output.write(data);
}

} catch (IOException e) { ... }

2. تدفقات الأحرف (Character Streams)

  • تتعامل مع بيانات النصوص (الأحرف)، باستخدام ترميز مثل UTF-8.
  • الفئات الأساسية: Reader و Writer.
  • الفئات الملموسة: FileReader, FileWriter.

3. التدفقات المبطنة (Buffered Streams) ونمط Decorator

لتحسين الأداء، غالباً ما يتم تغليف التدفقات في تدفقات مبطنة. يقوم التبطين بقراءة كتل كبيرة من البيانات من القرص في وقت واحد، مما يقلل من عمليات الإدخال/الإخراج.

  • BufferedReader/BufferedWriter (أحرف)
  • BufferedInputStream/BufferedOutputStream (بايت)

java try (BufferedReader br = new BufferedReader(new FileReader("large.txt"))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { ... }

Try-with-Resources: لاحظ استخدام صيغة try ( ... ). يضمن ذلك إغلاق التدفقات تلقائياً وأمان، حتى في حالة وقوع استثناء.