Topic: 怎麼樣打開一個文件,然後把它鎖住,讓別人只能看不能修改?

  Print this page

1.怎麼樣打開一個文件,然後把它鎖住,讓別人只能看不能修改? Copy to clipboard
Posted by: wymanlife
Posted on: 2005-09-29 17:42

怎麼樣打開一個文件,然後把它鎖住,讓別人只能看不能修改?

2.Re:怎麼樣打開一個文件,然後把它鎖住,讓別人只能看不能修改? [Re: wymanlife] Copy to clipboard
Posted by: zcjl
Posted on: 2005-09-29 22:17

以下文字摘自TIJ 3rd Edition(翻译by shhgs)


文件锁

JDK 1.4的文件锁"file locking"允许你以文件为共享资源,对访问进行同步化处理(allows you to synchronize access to a file as a shared resource)。但是,竞争文件的两个线程必须属于两个不同的JVM,或者一个是Java线程,另一个是操作系统的本地线程。由于Java的文件锁是直接映射操作系统的锁机制的,因此其它进程也能看到文件锁。

下面就举一个简单的例子:

//: c12:FileLocking.java
// {Clean: file.txt}
import java.io.FileOutputStream;
import java.nio.channels.*;
public class FileLocking {
public static void main(String[] args) throws Exception {
FileOutputStream fos= new FileOutputStream("file.txt");
FileLock fl = fos.getChannel().tryLock();
if(fl != null) {
System.out.println("Locked File");
Thread.sleep(100);
fl.release();
System.out.println("Released Lock");
}
fos.close();
}
} ///:~


要想获取整个文件的锁,可以用FileChannel的tryLock( )或lock( )方法。(SocketChannel,DatagramChannel,以及 ServerSocketChannel是不需要锁的,因为它们原本就是"进程实体(single-pricess entities)";一般来说,你是不会让两个进程去共享一个网络socket的。)tryLock( ) 是非阻塞的。它会试着去获取这个锁,但是如果得不到(其它进程已经以独占方式得到这个锁了),那它就直接返回。而lock( )是阻塞的。如果得不到锁,它会在一直处于阻塞状态,除非它得到了锁,或者你打断了调用它(即lock( )方法)的线程,或者关闭了它要lock( )的channel,否则它是不会返回的。最后用FileLock.release( )释放锁。

3.Re:怎麼樣打開一個文件,然後把它鎖住,讓別人只能看不能修改? [Re: wymanlife] Copy to clipboard
Posted by: wymanlife
Posted on: 2005-09-30 08:34

謝謝!
但是我用FileLock.tryLock()的時候,運行的時候報下面的錯誤:
Exception in thread "Thread-2" java.nio.channels.NonWritableChannelException
at sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:818)
at java.nio.channels.FileChannel.tryLock(FileChannel.java:967)
at MyEdit.listener.OpenItemListener$FileLoader.run(OpenItemListener.java:91)

我是這樣子的,我是在Java程序裡打開一個文件(讀取了內容到JTextArea裡面)之後,然後,調用這個channel的FileLock.tryLock()。然後就報上面的錯了。
而且,當我再次用該同一程序打開同這個一個文件的時候,一樣可以對該文件進行修改。
為什麼呢?

4.Re:怎麼樣打開一個文件,然後把它鎖住,讓別人只能看不能修改? [Re: wymanlife] Copy to clipboard
Posted by: zcjl
Posted on: 2005-09-30 14:35

1.对于NonWritableChannelException,应该是你尝试锁定一个非可写的文件造成的
比如我这样写就会出现同样的异常:
FileLock lock = new RandomAccessFile("e:/protocol.xml", "r").getChannel().tryLock();

而代码修改如下,就会正常运行:
FileLock lock = new RandomAccessFile("e:/protocol.xml", "rw").getChannel().tryLock();

所以,要解决这个问题,还是仔细检查一下代码,当然,自己实在看不出原因,帖出来大家帮你也可以的

2.对于
當我再次用該同一程序打開同這個一個文件的時候,一樣可以對該文件進行修改

请仔细看我帖出来的这段文字:
但是,竞争文件的两个线程必须属于两个不同的JVM,或者一个是Java线程,另一个是操作系统的本地线程。由于Java的文件锁是直接映射操作系统的锁机制的,因此其它进程也能看到文件锁。


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923