البرمجة

تحسين قراءة وكتابة ملفات الصور في Java بدون ImageIO

في بداية هذا السياق، يُشير الكود الذي كتبته إلى محاولتك لقراءة ملفات الصور (بصيغة jpg) من مجلد معين ونسخها إلى مجلد آخر دون استخدام ImageIO أو طرق النقل/النسخ القياسية، مع التركيز على قياس الزمن اللازم لعمليات القراءة والكتابة.

أولاً، يُلاحظ أن لديك بعض الأخطاء في الكود التي يجب التصحيح عليها. على سبيل المثال، الحلقة التي تقوم بقراءة الملفات يجب أن تكون أكثر دقة وفعالية. في الوقت الحالي، يبدو أن الحلقة ليست مكتملة وليست هناك عملية فعلية للقراءة من الملف.

إليك تصحيح بسيط للحلقة:

java
// ... // read the images and check reading time consuming try { fis = new FileInputStream(filePath); bis = new BufferedInputStream(fis); start_t = d.getTime(); // انقل هذا السطر إلى هنا لبدء قياس الوقت while ((byt = bis.read()) != -1) { // perform any necessary operations here, if needed } end_t = d.getTime(); System.out.println(end_t - start_t); } catch (Exception e) { e.printStackTrace(); } finally { try { if (bis != null) bis.close(); if (fis != null) fis.close(); } catch (IOException e) { e.printStackTrace(); } } // ...

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

إليك تصحيح بسيط للحلقة:

java
// ... // write the images and check writing time consuming try { fos = new FileOutputStream(destPath); bos = new BufferedOutputStream(fos); start_t = d.getTime(); // انقل هذا السطر إلى هنا لبدء قياس الوقت while ((byt = bis.read()) != -1) { bos.write(byt); } end_t = d.getTime(); System.out.println(end_t - start_t); } catch (Exception e) { e.printStackTrace(); } finally { try { if (bos != null) bos.close(); if (fos != null) fos.close(); } catch (IOException e) { e.printStackTrace(); } } // ...

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

بتصحيح هذه الأخطاء، قد تكون قادرًا على تحقيق النتائج المرجوة في برنامجك.

المزيد من المعلومات

في محاولتك لقراءة وكتابة ملفات الصور بلغة البرمجة Java دون استخدام ImageIO أو طرق النقل القياسية، يجدر بنا التركيز على بعض النقاط الأساسية.

أولًا، يجب فهم أن FileInputStream و FileOutputStream هما وسائل لقراءة وكتابة البايتات في الملفات على مستوى البايت، وليسوا مخصصين خصيصًا لقراءة أو كتابة ملفات الصور. وبالتالي، يمكن استخدامهما بشكل عام لجميع أنواع الملفات.

ثانيًا، تأكد من أنك قد قمت بالتحقق من وجود الملفات في المسار المحدد قبل القراءة أو الكتابة. يمكنك استخدام File.exists() لفحص ذلك.

ثالثًا، لقد لاحظت أنك تستخدم توقيت الوقت باستمرار، ولكن يجب أن تعلم أن قياس الوقت بهذه الطريقة قد لا يكون دقيقًا بما يكفي. يمكن استخدام System.currentTimeMillis() بدلاً من Date.getTime() لتحسين الدقة.

وفيما يلي نصيحة إضافية:

  1. استخدم try-with-resources:
    يُفضل استخدام try-with-resources لضمان إغلاق المدخلات والمخرجات بشكل صحيح بعد الانتهاء من استخدامها. يمكنك تحقيق ذلك عن طريق استبدال الكود التالي:

    java
    try (FileInputStream fis = new FileInputStream(filePath); BufferedInputStream bis = new BufferedInputStream(fis)) { // الكود هنا } catch (IOException e) { e.printStackTrace(); }
  2. تقسيم العمليات:
    يمكنك تجزئة عملية القراءة والكتابة إلى وحدات أصغر، مثل استخدام byte[] لقراءة وكتابة البيانات بشكل فعال.

    java
    byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = bis.read(buffer)) != -1) { bos.write(buffer, 0, bytesRead); }
  3. التحقق من وجود الملفات:
    قبل بدء عملية القراءة أو الكتابة، تأكد من وجود الملف باستخدام File.exists().

    java
    File sourceFile = new File(filePath); if (sourceFile.exists()) { // قم بعملية القراءة هنا }
  4. التعامل مع الأخطاء بشكل أفضل:
    قم بتحسين إدارة الأخطاء في كودك لتحديد مكان وجود المشكلة بشكل أدق.

    java
    } catch (IOException e) { e.printStackTrace(); }

باستخدام هذه النصائح وتحسينات الكود المُقترحة، يمكنك زيادة فعالية برنامجك وتحسين قدرته على قراءة وكتابة ملفات الصور بشكل صحيح.

زر الذهاب إلى الأعلى