我已经设计了两个同时运行的应用程序(我不想将它们组合在一起),一个从某个文件中读取,另一个写入它。当一个或另一个没有运行错误时,但是如果它们都运行get get访问被拒绝错误。 第一个相关代码:
class MakeImage implements Runnable {
@Override
public void run() {
File file = new File("C:/Users/jeremy/Desktop/New folder (3)/test.png");
while (true) {
try{
//make image
if(image!=null)
{
file.createNewFile();
ImageIO.write(image, "png", file);
hello.repaint();}}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
第二个相关代码:
BufferedImage image = null;
try {
// Read from a file
image = ImageIO.read(new File("C:/Users/jeremy/Desktop/New folder (3)/test.png"));
}
catch(Exception e){
e.printStackTrace();
}
if(image!=null)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write( image, "png", baos );
baos.flush();
byte[] imageInByte = baos.toByteArray();
baos.close();
returns=Base64.encodeBase64String(imageInByte);
}
我看了这个:Java: how to handle two process trying to modify the same file,但是当两个人都写到文件时,这里只有一个文件。我尝试了前面的答案中建议的重试方法,没有任何运气。任何帮助将不胜感激。
答案 0 :(得分:3)
除非您使用某种类型的操作系统级别文件锁定并检查锁定,否则您将无法可靠地执行此操作。管理这个问题的一种相当可靠的方法是使用目录中的另一个文件作为信号量,在您编写或阅读时“触摸”它,并在完成后将其删除。在访问文件之前检查信号量是否存在。否则,您将需要使用某种数据库来存储文件锁(保证一致性)并在那里检查它。
那就是说,你真的应该把它合并为一个程序。
答案 1 :(得分:0)
在修改文件的方法上使用synchronized
。
<强>编辑:强>
根据线程安全类的定义,它是这样的。“一个类被认为是线程安全的,它可以在底层操作系统交错和调度的情况下正常工作,没有同步手段来自客户端的机制“。
我相信有一个文件可以访问不同的机器,所以必须有一些客户端 - 服务器机制,如果它在那里..然后让服务器端有同步机制,然后它没有关系有多少客户端访问它...
如果没有,同步就足够了........
答案 2 :(得分:0)
这是一个有用但非常危险的功能。它就像这样“如果你为同一个文件创建不同的RandomAccessFile实例,你可以同时写入文件的不同部分。”
您可以使用seek方法创建指向文件不同部分的多个线程,多个线程可以同时更新文件。 Seek允许您移动到文件的任何部分,即使它不存在(在EOF之后),因此您可以移动到新创建的文件中的任何位置并在该位置上写入字节。您可以打开同一文件的多个实例并搜索不同的位置并同时写入多个位置。