मैंने देखा है कि java.io
और java.nio
यादृच्छिक एक्सेस फ़ाइलों के कार्यान्वयन FileLocks
के संबंध में थोड़ा अलग हैं।यादृच्छिक अभिगम फ़ाइल फ़ाइल लॉक: java.io बनाम java.nio
ऐसा लगता है कि (विंडोज़ पर) java.io
आपको एक अनिवार्य फ़ाइल लॉक देता है और java.nio
आपको क्रमशः अनुरोध करने पर सलाहकार फ़ाइल लॉक देता है। एक अनिवार्य फ़ाइल लॉक का अर्थ है कि लॉक सभी प्रक्रियाओं के लिए है और एक सलाहकार अच्छी प्रक्रियाओं के लिए रखता है जो समान लॉकिंग प्रोटोकॉल का पालन करते हैं।
यदि मैं निम्नलिखित उदाहरण चलाता हूं, तो मैं *.nio
फ़ाइल मैन्युअल रूप से हटा सकता हूं, जबकि *.io
फ़ाइल हटाई जाने से इंकार कर दिया जाता है।
import java.io.*;
import java.lang.management.ManagementFactory;
import java.nio.*;
import java.nio.channels.*;
import java.nio.file.*;
public class NioIoLock {
public static void main(String[] args) throws IOException, InterruptedException {
String workDir = System.getProperty("user.dir");
FileChannel channelIo, channelNio;
FileLock lockIo, lockNio;
// use io
{
String fileName = workDir
+ File.separator
+ ManagementFactory.getRuntimeMXBean().getName()
+ ".io";
File lockFile = new File(fileName);
lockFile.deleteOnExit();
RandomAccessFile file = new RandomAccessFile(lockFile, "rw");
channelIo = file.getChannel();
lockIo = channelIo.tryLock();
if (lockIo != null) {
channelIo.write(ByteBuffer.wrap("foobar".getBytes("UTF-8")));
}
}
// use nio
{
Path workDirPath = Paths.get(workDir);
Path file = workDirPath.resolve(
Paths.get(ManagementFactory.getRuntimeMXBean().getName() + ".nio"));
// open/create test file
channelNio = FileChannel.open(
file, StandardOpenOption.READ, StandardOpenOption.WRITE,
StandardOpenOption.CREATE, StandardOpenOption.DELETE_ON_CLOSE);
// lock file
lockNio = channelNio.tryLock();
if (lockNio != null) {
channelNio.write(ByteBuffer.wrap("foobar".getBytes("UTF-8")));
}
}
// do not release locks for some time
Thread.sleep(10000);
// release io lock and channel
if (lockIo != null && lockIo.isValid()) {
lockIo.release();
}
channelIo.close();
// release nio lock and channel
if (lockNio != null && lockNio.isValid()) {
lockNio.release();
}
channelNio.close();
}
}
क्या इसका कोई कारण है? क्या इन दोनों को विकल्प के रूप में भी माना जाता है या क्या वे अनिश्चित काल तक सह-अस्तित्व में हैं?
एनआईओ संस्करण में 'SYNC, DSYNC' जोड़ने से कोई फर्क पड़ता है? तो यह एक प्रदर्शन विचार किया गया होगा। –
'SYNC, DSYNC' जोड़ने से कोई फर्क नहीं पड़ता – starikoff