عند استخدام FileLock جاوة، هل هو موافق للسماح قريب () للقيام lock.release تلقائيا ()؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

وبما أن معظم يجب أن تعرف close() يغلق أيضا أي تيارات يستخدم.

وهذا يسمح للكود التالي:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(...)));
...
br.close();

وهذا هو لطيف، لأننا لسنا بحاجة إلى الإشارة إلى FileInputStream وتذكر لإغلاقه.

ولكن يعمل أيضا لFileLock

final FileInputStream fis = new FileInputStream(new File("buffer.txt"));
final FileChannel c = fis.getChannel();
final FileLock lock = c.lock(0L, Long.MAX_VALUE, true);
final BufferedReader br = new BufferedReader(new InputStreamReader(fis));

try {
    while(br.ready()) {
        System.out.println(br.readLine());
    }
} finally {
    br.close();
}

ولقد حاول هذا الرمز ويتم تحرير التأمين بشكل صحيح عندما يتم استدعاء br.close()، ولكن غير آمنة للقيام بذلك؟ و يقول ، <م> "إغلاق هذا التيار والنشرات أي موارد النظام المرتبط به." هل أنا الأسلم أن نفترض أن أستخدمه close() كما هو محدد في release() القفل؟

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

المحلول

ووفقا ل جافادوك :

<اقتباس فقرة>   

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

وهنا محتويات FileInputStream.close()

public void close() throws IOException {
    if (channel != null)
        channel.close();
    close0();
}

ويبدو close على تيار يغلق القناة الذي يطلق القفل.

نصائح أخرى

نعم.

وأقفال تعتمد على واصف الملف. عندما لا يكون هناك اصف ملف يمثل ملف في العملية، لن يكون هناك قفل المرتبطة به.

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