محتويات الدورة

Java / المتوسط / الدرس 10

الإدخال والإخراج والمسارات والترميز والوقت

ابنِ حدوداً واضحة بين البايتات والنصوص والملفات والقيم الزمنية واستدل بشأن الإدخال المحدود وملكية الموارد وافتراضات الملفات.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • فك البايتات بترميز صريح.
  • تمييز المسار اللفظي من هوية الملف الفعلية.
  • اختيار أنواع الوقت وسياسات إدخال محدودة.

حدد حد الترميز

تحتوي الملفات والرسائل بايتات، وتمثل String نصاً بوحدات UTF-16. تربط مجموعة المحارف التمثيلين. حدد StandardCharsets.UTF_8 عندما تفرض الصيغة UTF-8 لا افتراضي الجهاز. تغير الافتراضي عبر تاريخ JDK، فلا تعتمد Java17 البيئة صامتاً لتفسير صيغة محمولة.

يحوّل المثال تحية عربية إلى UTF-8 ويعيدها فتكون المساواة صحيحة لاتساق الترميز وعدم فقد البايتات. لا تعمم ذلك على إدخال تالف. تهم سياسة الخطأ؛ فقد تستبدل عمليات ميسرة التسلسل التالف بينما يبلّغ CharsetDecoder مضبوط بصرامة عنه.

java دورة UTF-8 صريحة
public class Main {

 public static void main(String[] args) throws Exception {
String text="مرحبا";
byte[] bytes=text.getBytes(java.nio.charset.StandardCharsets.UTF_8);
String decoded=new String(bytes,java.nio.charset.StandardCharsets.UTF_8);
System.out.println(text.equals(decoded));
System.out.println(decoded);
 }
}
الناتج المتوقع
true
مرحبا

يتفق التحويلان على UTF-8 فتحفظ التحية المصطنعة؛ ويترجم المصدر بالترميز نفسه.

قيّد الإدخال قبل تخصيصه كله

تناسب قراءة الملف كله إلى مصفوفة أو نص حجماً محدوداً بالعقد فقط. للمدخل الكبير أو غير الموثوق عالج أجزاء محددة وافرض حداً يشمل حجم فك الضغط. لا يحل فحص الذاكرة المتاحة محل حد مقصود تحت التزامن.

أغلق المورد المملوك بـtry-with-resources. يحتاج دفق Files.lines نفسه إغلاقاً لاحتفاظه بملف حتى بعد عملية نهائية. يتجنب StringReader أوByteArrayInputStream الملفات في الدرس مع شرح العمر. حدد الفشل الجزئي وهل يتلقى المستهلك نتيجة ناقصة.

افصل تطبيع النص عن فحص الوصول

تجمع Path.resolve مكونات المسار وتبسط normalize مقاطع النقاط لفظياً. لا تصل للملفات ولا تحل الروابط الرمزية. قد يصل مسار يبدو داخل جذر إلى خارجه عبر رابط أو سلوك منصة أو سباق الفحص والفتح. عامل الوصول حد أمان لا تنظيف نص.

يطبع المثال اسم الملف النهائي فقط ليبقى مستقلاً عن فاصل النظام ولا يصل للقرص. يجب أن يختار الرفع أو التصدير جذراً موثوقاً ويفحص الاسم ويطبق سياسة المسار الفعلي وعدم تتبع الروابط ويراعي السباق. لا تعد بأن normalize وحدها تمنع اجتياز المسار.

java عمليات مسار لفظية دون ملفات
public class Main {

 public static void main(String[] args) throws Exception {
var path=java.nio.file.Path.of("training").resolve("reports/../summary.txt").normalize();
System.out.println(path.getFileName());
 }
}
الناتج المتوقع
summary.txt

يلغي المقطع الأب reports لفظياً فيعود summary.txt، دون إثبات وجود أو أمان.

مثّل الوقت بدلالته الصحيحة

يمثل Instant نقطة زمنية، وLocalDate تاريخاً بلا وقت أو منطقة، وZonedDateTime وقتاً بقواعد منطقة. ليست LocalDateTime وحدها لحظة عالمية فريدة. قد ينشئ انتقال التوقيت أوقاتاً مفقودة أو متكررة، فتحتاج التحويلات سياسة. خزّن تمثيلاً ثابتاً مناسباً ونسّق للمستخدم عند الحد.

احقن Clock في منطق الوقت بدلاً من قراءة الساعة في كل موضع لجعل اختبارات الانتهاء والجدولة حتمية. استخدم Duration للمدة وPeriod لفروق التقويم حسب المجال. تقيس System.nanoTime مدة رتيبة لا تاريخ حدث صالحاً للتخزين.

تحقق من الصيغ وافتراضات البيئة

يحدد عقد الإدخال الترميز والحجم وفواصل السجلات وسياسة التالف والوقت والملكية. اختبر الفراغ والسطر الأخير الناقص والنص غير ASCII والبايتات التالفة والحجم الزائد والإغلاق. لا يثبت ملف ASCII قصير صحة اللغات أو أمان الذاكرة.

افصل التحليل من اكتساب الملف لتستخدم أغلب الاختبارات بايتات أو قارئات ذاكرة. اعزل تكامل الملفات في مجلدات مؤقتة مع تنظيف دون ملفات المستخدم والخدمات. ميّز الصلاحية والغياب والتلف والإلغاء بسياق مقيد، وأبعد المسارات والمحتوى الحساس عن الرسائل العامة.

الأخطاء الشائعة وإصلاحها

MalformedInputException

لماذا يحدث؟
لا تطابق البايتات عقد فك الترميز.
كيف تصلحه؟
ارفض أو اعزل وتحقق من ترميز المنتج.
كيف تتجنب تكراره؟
حدد الترميز واختبر التالف.

OutOfMemoryError while reading a file

لماذا يحدث؟
حُمّل محتوى بلا حد أو تزامنت قراءات كثيرة.
كيف تصلحه؟
افرض حدود الحجم والتزامن وعالج التدفق.
كيف تتجنب تكراره؟
اختبر ميزانية الضخم والمضغوط.

Path normalization was treated as authorization

لماذا يحدث؟
أهمل التنظيف اللفظي الروابط والسباقات.
كيف تصلحه؟
استخدم تصميماً بجذر موثوق وفحوص ملفات مناسبة.
كيف تتجنب تكراره؟
راجع الوصول كحد أمان.

اختبر فهمك

1. ملف UTF-8 يقرأ بافتراضي آخر. ما التغير؟

اعرض الحل المشروح

قد تنتج البايتات نصاً مختلفاً أو تالفاً. حدد UTF-8 وافحص التالف، ولا تصلح العرض بعد حد فك ترميز خاطئ.

2. ينتهي طلب بعد24 ساعة فعلية. ماذا تستخدم للاختبار؟

اعرض الحل المشروح

استخدم Instant وDuration.ofHours(24) وClock ثابتة محقونة. اختبر لحظة الانتهاء نفسها؛ فقد يختلف يوم تقويمي محلي عن24 ساعة عند تغير التوقيت.

أهم ما تعلمته

  • تحتاج البايتات ترميزاً والوقت نوعاً دلالياً.
  • التطبيع لفظي ولا يفوض الملفات.
  • قيّد الحجم والتزامن وعمر الموارد.

المراجع الرسمية