هل يضمن كود جافا التالي والقفل الحصري لملف غير مفتوح في نظام التشغيل Windows؟

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

سؤال

هل يضمن كود Java التالي قفلًا حصريًا لملف غير مفتوح في Windows؟

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {
    public static void main(String[] args) {
        File file = new File("mylog.log");
        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.getChannel().lock();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
هل كانت مفيدة؟

المحلول

كما قد يرى في مواصفات Java:

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

لذلك إذا كنت بحاجة إلى قفل حصري للخيط، فيرجى اختيار طريقة أخرى.

نصائح أخرى

ليرة تركية؛دكتور: لا.لا يمكنك وضع افتراضات حول سلوك معالجة نظام التشغيل المضيف لأقفالك.

أخبار جيدة: هل تحاول التأكد من أن لديك آلية قفل آمنة للخيط داخل تطبيقك؟لو ذلك، FileLock يكفي (على افتراض أن بقية التطبيق يتكون من تعليمات برمجية آمنة للخيط مكتوبة بشكل صحيح بالطبع).

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

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

من وثائق FileLock:

يتم عقد أقفال الملف نيابة عن الجهاز الظاهري Java بأكمله.فهي ليست مناسبة للتحكم في الوصول إلى ملف بواسطة مؤشرات ترابط متعددة داخل نفس الجهاز الظاهري.

كائنات قفل الملفات آمنة للاستخدام بواسطة مؤشرات ترابط متزامنة متعددة.

...و لاحقا ...

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

حتى إذا كنت تستخدم قفل وفتح أعلام الملف, أنت فقط ضمان أن يكون لديك تأمين الحصري ضمن تطبيق جافا.

يمكنك إما استخدام JNI ، أو آخر لغة الكمبيوتر, لجعل ويندوز يدعو إلى ضمان تأمين حصري على ملف Windows.

ويندوز LockFile وظيفة

ويندوز UnlockFile وظيفة

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