我有两个进程可以查看相同的文件,并希望实现文件锁定.问题似乎是一个进程用java编写而另一个进程用C编写,并且不清楚java端如何实现低级锁定.该平台是Solaris 10.我尝试在文件上引入锁定,以防止在C进程读取文件时Java进程进行更新.我的想法是尝试从java代码中获取一次锁定10次,然后才无条件地写入文件(我假设锁定类型是一个咨询锁定).但是,java tryLock()会在第二次尝试时中断C进程的锁定并破坏读取.
这是代码,简化(Java):
int iAttemptCnt = 0;
FileChannel wchannel = new FileOutputStream(new File(fileName), false).getChannel();;
FileLock flock;
while(true){
try{
MyLog.log(MyLog.LVL_INFO, "attempt to lock file");
if( (flock = wChannel.tryLock()) == null ){
// lock held by another program
if(++iAttemptCnt >= 10
break;
}
else{
MyLog.log(MyLog.LVL_INFO, " file locked");
break;
}
}catch(OverlappingFileLockException ofle){
.......
if(++iAttemptCnt >= 10 ){
...
break;
}
}catch(IOException ioe){
throw new IOException("failed to lock the file");
}
try{
MyLog.log(MyLog.LVL_INFO, "File already locked, retrying in one second");
Thread.sleep(1000);
}catch(InterruptedException …Run Code Online (Sandbox Code Playgroud) 我为一个简单的目的创建了一个小型Java servlet:一旦调用它,它将执行以下步骤:
简化版代码:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
FileInputStream inputStream = new FileInputStream("foo.json");
String filecontent = IOUtils.toString(inputStream);
inputStream.close();
JSONObject json = new JSONObject(filecontent);
doSomeChangesTo(json);
FileWriter writer = new FileWriter("foo.json");
writer.write(json.toJSONString());
writer.flush();
writer.close();
}
Run Code Online (Sandbox Code Playgroud)
现在我面临的问题是,几乎可以通过两个或多个对servlet的http请求来调用servlet.为了避免对同一文件进行多次并行写访问,我需要以某种方式同步它.根据我对servlet生命周期过程的理解,每个请求都会生成一个新线程,因此使用FileLock可能没有任何影响:
文件锁代表整个Java虚拟机.它们不适合控制同一虚拟机中多个线程对文件的访问.
(来自http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileLock.html)
我想使用synchronized(){}关键字也不起作用,因为我想同步文件系统访问而不是访问变量/对象.
那么,当该servlet上发生多个并行请求时,如何在我的servlet中同步文件系统访问?
我在本地文件系统上有一堆文件.我的服务器将提供这些文件.在某些情况下,服务器将收到删除文件的指令.目前我正在使用FileChannel.lock()锁定文件,这主要是为了确保在我尝试删除文件时其他一些进程没有编辑该文件.
如果我成功获取了锁,我可以立即删除该文件,还是需要先释放锁?
像这样:
FileOutputStream out = new FileOutputStream(file);
FileChannel channel = out.getChannel();
FileLock lock = channel.lock();
if(lock.isValid() && !lock.isShared()){
Path filePath = Paths.get(file.getPath());
Files.delete(filePath);
}
Run Code Online (Sandbox Code Playgroud)
我删除文件后是否需要释放锁定?
或者应该是这样(lock.release()添加):
FileOutputStream out = new FileOutputStream(file);
FileChannel channel = out.getChannel();
FileLock lock = channel.lock();
if(lock.isValid() && !lock.isShared()){
lock.release();
Path filePath = Paths.get(file.getPath());
Files.delete(filePath);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
所以事实证明上面的代码无论如何都不会工作,因为你不能用a修改文件FileInputStream,当然,它只是只读.我已修改上面的代码FileOutputStream而不是使用它,但它仍然不能正常工作,因为即使我从通道释放锁,该file对象仍然有一个锁.所以我像这样修改了代码:
FileOutputStream out = new FileOutputStream(file);
FileChannel channel = out.getChannel();
FileLock lock = channel.lock();
if(lock.isValid() && !lock.isShared()){
channel.close();
boolean …Run Code Online (Sandbox Code Playgroud) 我需要用Java阅读和处理一些大文件,我想知道,如果有一些明智的方法可以保护文件,当我正在阅读和处理它时,它不会被其他进程覆盖?
也就是说,某种方式使它成为只读,保持"开放"或某事......
这将在Windows环境中完成.
br,Touko
在我的列表视图中,我在某个文件夹中显示小图像的缩略图.我按如下方式设置了listview:
var imageList = new ImageList();
foreach (var fileInfo in dir.GetFiles())
{
try
{
var image = Image.FromFile(fileInfo.FullName);
imageList.Images.Add(image);
}
catch
{
Console.WriteLine("error");
}
}
listView.View = View.LargeIcon;
imageList.ImageSize = new Size(64, 64);
listView.LargeImageList = imageList;
for (int j = 0; j < imageList.Images.Count; j++)
{
var item = new ListViewItem {ImageIndex = j, Text = "blabla"};
listView.Items.Add(item);
}
Run Code Online (Sandbox Code Playgroud)
用户可以右键单击列表视图中的图像以将其删除.我从列表视图中删除它,然后我想从文件夹中删除此图像.现在我收到文件正在使用的错误.当然这是合乎逻辑的,因为图像列表正在使用该文件.
我试图先从图像列表中删除图像,但我继续保持文件锁定.
有人能告诉我我做错了什么吗?
谢谢!
我正在用 Java 创建一个应用程序,我只想运行一个实例。为此,我创建了一个文件并在我的应用程序运行时获得了一个锁。
我有以下代码适用于 Windows,但在 Linux 上失败:一旦我获得了一个锁而不解锁它,我可以获得另一个锁。
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class MyApp {
private static File f;
private static FileChannel channel;
private static FileLock lock;
public static void main(String[] args) {
try {
f = new File("RingOnRequest.lock");
// Check if the lock exist
if (f.exists()) {
// if exist try to delete it
f.delete();
}
// Try to get the lock
channel = new RandomAccessFile(f, "rw").getChannel();
lock = channel.tryLock();
if(lock == null) …Run Code Online (Sandbox Code Playgroud) 评论解决:
应用程序崩溃是由另一个问题引起的
我正在读取/写入来自2个不同应用程序的文件,当正在读取或写入文件时,它将始终被应用程序A或B锁定,并且它们都使用FileShare.None.
我的问题是,即使将读者包装在try/catch中,它仍然会在使用行中使用IOException崩溃应用程序(写入程序不会发生).
我也做了catch (IOException ...我认为没有区别的捕获,然后让它更具可读性.
在文件被锁定时忽略的正确方法是什么,并在文件可用之前继续尝试?
while (true)
{
try
{
using (FileStream stream = new FileStream("test_file.dat", FileMode.Open, FileAccess.Read, FileShare.None))
{
using (TextReader reader = new StreamReader(stream))
{
// bla bla bla does not matter
}
}
}
catch
{
// bla bla bla does not matter again
}
Thread.Sleep(500);
}
Run Code Online (Sandbox Code Playgroud)
写
private bool WriteData(string data)
{
try
{
using (FileStream stream = new FileStream("test_file.dat", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
{
stream.SetLength(0);
using (TextWriter writer = …Run Code Online (Sandbox Code Playgroud) 我在pictureBox中使用c#显示图像.然后我想改变图像的名称.我不能,因为我得到了另一个进程正在使用的图像.
我这样打开图像
Image image1 = Image.FromFile("IMAGE LOCATION"); ;
pictureBox1.Image = image1;
Run Code Online (Sandbox Code Playgroud)
然后尝试以这种方式更改它的名称,我得到一个IO异常,说"进程无法访问该文件,因为它正被另一个进程使用.
System.IO.File.Copy(@"OldName", @"NewName"); //copy changes name if paths are in the same folder
Run Code Online (Sandbox Code Playgroud)
对象image1不是持有图像吗?为什么文件仍然被前一个进程锁定?任何建议,将不胜感激.非常感谢!
当您卸载程序时,Windows 如何在下次重新启动时删除锁定的文件?也许有某种预定的流程?
我认为我们能够锁定文件以进行独占访问,因为我看到了此链接:http : //developer.android.com/reference/java/nio/channels/FileLock.html
我想在后台进程(服务)和真正的前台应用程序中创建一个保存/加载文件。他们可能会尝试同时访问此文件,在这种情况下,应该等待。
我在Android上找不到FileLock的真实示例,我只是读了很多线程,而这在Android上是不可能的。但是,如果是这样,为什么文档中有“ FileLock”部分?
filelock ×10
java ×6
c# ×3
concurrency ×2
delete-file ×2
.net ×1
.net-4.0 ×1
android ×1
file ×1
file-io ×1
file-locking ×1
linux ×1
listview ×1
nio ×1
solaris ×1
synchronized ×1
windows ×1
winforms ×1