كيفية استخدام جمع البيانات المهملة لحذف الملفات؟

StackOverflow https://stackoverflow.com/questions/1057037

سؤال

مرحبًا، أنا أستخدم الكثير من الملفات المؤقتة في جافا ومشكلتي هي أنه لا يتم حذفها.

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

1 - باستخدام File tmp = File.createTempFile()، بالتأكيد أستطيع أن أقول tmp.deleteOnExit() ولكن إذا كان الشيء يعمل في خدمة، فإن الطريقة الوحيدة للخروج هي عندما يتعطل (نادرًا ما يحدث ذلك)، أو عندما يتعطل النظام ( كما هو الحال عندما يكون محرك الأقراص ممتلئًا تمامًا بالملفات المؤقتة ويطيح بالمجموعة ...أُووبس !)

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

الطريقة الوحيدة التي أراها الآن هي التحميل الزائد على فئة الملف وإضافة طريقة نهائية ...إذا قمت بذلك فقد أذهب أيضًا إلى مدير الملفات المؤقت الخاص بي!

باختصار، هل يمكنني استخدام Garbage Collector لتنظيف موارد النظام (أي الملفات) أيضًا؟


شكرا لكم جميعا على إجاباتكم.لقد قبلت كريستوفر لأنه كان الأسهل في التنفيذ وهو ما انتهى بي الأمر إلى فعله.

أعتقد أن التنظيف بعد سنوات عديدة جعلني أنسى التدبير المنزلي الأساسي الذي كنت أقوم به بالطريقة الصعبة في الأيام الجيدة لـ C++.

هل كانت مفيدة؟

المحلول

بالطبع تستطيع.السؤال هو هل تريد حقا :)

لقد واجهت هذه المشكلة بالفعل في البرية؛كما لاحظت، فإن تنظيف الملفات المؤقتة باستخدام ()deleteOnExit لا فائدة منه عند تشغيل خدمة بدلاً من تطبيق.لقد وجدت أن الحل الأكثر استقرارًا هو إعادة هيكلة تدفق البرنامج بحيث يتم إنشاء الملفات المؤقتة على أساس كل مهمة، وحذفها صراحةً عند عدم الحاجة إليها.

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

نصائح أخرى

قد ترغب في النظر في مرجع فانتوم:

الكائنات المرجعية الوهمية، التي يتم وضعها في قائمة الانتظار بعد أن يقرر المجمع أنه يمكن استعادة مراجعها بطريقة أخرى.يتم استخدام المراجع الوهمية في أغلب الأحيان لجدولة إجراءات التنظيف قبل الوفاة بطريقة أكثر مرونة مما هو ممكن مع آلية إنهاء Java.

لن يكون الاعتماد على حدث يتم إطلاقه عند تدمير فصلك أمرًا مضمونًا، وقد يؤدي إلى ترك ملفات خلفك.

أعتقد أن الطريقة الأبسط والأكثر موثوقية لتحقيق تنظيف ملفاتك المؤقتة هي كما يلي:

  • اكتب معالج الأحداث عند إغلاق البرنامج لتنظيف أي ملفات قمت بفتحها أثناء الجلسة الحالية.
  • اكتب الإجراء الذي سيتم تشغيله عند بدء تشغيل البرنامج، والذي يحذف أي ملفات مؤقتة في هذا المجلد مضى عليها أكثر من 24 ساعة.

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

تعتبر مجموعة البيانات المهملة مساحة اسم خاطئة لهذا النوع من معالجة المعلومات.

يجب أن تكون النقطة التالية كافية للتعامل مع الملفات المؤقتة.

  1. يجب أن تحاول حذف الملف مباشرة بعد عدم استخدام الملف بعد الآن.يمكن للكتلة النهائية التعامل مع هذا.

  2. حذفOnExit يجب عليك استخدامه.

  3. يمكنك إنشاء ملفاتك المؤقتة في دليل مؤقت خاص.يمكنك حذف هذا الدليل المؤقت عند تشغيل التطبيق وإغلاقه، للتأكد من عدم وجود ملفات مؤقتة بعد إغلاق التطبيق.

جامع القمامة ليس مفيدًا لمثل هذه الأشياء.إنه مصمم لإدارة الذاكرة ويمكن أن يكون له العديد من الجوانب السلبية.

  • قد يتم جمع العنصر الخاص بك لفترة طويلة بعد انتهاء استخدام الملف.
  • ليس من المضمون أن يتم جمع العنصر الخاص بك على الإطلاق.

يحدث كلا الأمرين بشكل خاص في كثير من الأحيان، إذا تم بدء تشغيل Java بحجم كومة كبيرة - وهو أمر غير معتاد على جانب الخادم.

في مرحلة ما من برنامجك، يتعين عليك إغلاق التدفقات الموجودة على هذا الملف (وإلا فإنك ستأكل مقابض ملفات النظام، مما يجعل النظام غير قابل للاستخدام، وقد فعلت ذلك بالفعل).عند النقطة التي تغلق فيها التدفقات، يمكنك أيضًا حذف الملف المرتبط.هذه هي الطريقة الأنظف.

حسنًا، يمكنك إنشاء غلاف لملف يستخدم ملف Finalizer لحذف الملف الخاص بك عندما يتم جمع البيانات المهملة.

لكن لا يتم استدعاء المتأهلين للنهائيات بأي طريقة يمكن التنبؤ بها، لذا لا أوصي بذلك على الإطلاق.

جامع البيانات المهملة ليس مكانًا للقيام بهذا النوع من تحرير الموارد.يرجى الاطلاع على هاتين المقالتين أدناه حول كيفية تحرير الموارد في Javahttp://c2.com/cgi/wiki?ReleasingResourcesInJavaوأيضًا مشكلات الأداء مع أدوات إنهاء Java.قد يعطون بعض المعرفة والفهم حول كيفية استخدامها.http://www.enyo.de/fw/notes/java-gc-finalizers.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top