عند استخدام FileLock جاوة، هل هو موافق للسماح قريب () للقيام lock.release تلقائيا ()؟
سؤال
وبما أن معظم يجب أن تعرف close()
يغلق أيضا أي تيارات يستخدم.
وهذا يسمح للكود التالي:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(...)));
...
br.close();
وهذا هو لطيف، لأننا لسنا بحاجة إلى الإشارة إلى FileInputStream
وتذكر لإغلاقه.
ولكن يعمل أيضا لFileLock
s؟
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
على تيار يغلق القناة الذي يطلق القفل.
نصائح أخرى
نعم.
وأقفال تعتمد على واصف الملف. عندما لا يكون هناك اصف ملف يمثل ملف في العملية، لن يكون هناك قفل المرتبطة به.