2012-07-17 68 views
0

我制作了两个应用程序,旨在同时运行(我不想将它们组合在一起),一个应用程序从某个文件读取,另一个应用程序写入该应用程序。当其中一个或另一个没有运行错误时,但是如果它们都运行get获取访问被拒绝错误。第一 相关代码:JAVA:我的两个应用程序如何访问同一个文件?

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

数据库引擎? – Randy 2012-07-17 18:06:06

+0

复制写入? – Joel 2012-07-17 18:14:04

回答

3

除非你使用某种类型的操作系统级别的文件加锁,检查锁你”不能很容易地做到这一点。一种相当可靠的管理方法是将目录中的另一个文件用作信号量,当你写或阅读时“触摸”它,并在完成时将其移除。在访问文件之前检查是否存在信号量。否则,您将需要使用某种类型的数据库来存储文件锁定(保证一致性)并在那里检查它。

这就是说,你真的应该把它合并到1个程序中。

0

使用​​对方法修改文件

编辑:

由于每一个线程安全的类,它的这种方式的认定中。“类被认为是线程安全的,它正常工作在底层操作系统交错的存在并从客户端调度NO的同步机制手段“

我相信有一个文件是要访问到不同的机器,所以必须有一些客户端 - 服务器机制,如果它存在..然后让服务器端有同步机制,然后它doesnt事有多少客户端访问它...

如果没有,同步是绰绰有余........

+0

这些程序在单独的虚拟机中运行,这将如何帮助? – 2012-07-17 18:11:24

+0

查看编辑部分 – 2012-07-17 18:11:46

+0

我看不到他说的是不同的机器。 – 2012-07-17 18:16:00

0

尝试RandomAccessFile

这是一个很有用但很有危险功能。它就像这样“如果你为同一个文件创建不同的RandomAccessFile实例,你可以同时写入文件的不同部分。”
您可以使用seek方法创建指向文件不同部分的多个线程,并且多个线程可以同时更新文件。 Seek允许您移动到文件的任何部分(即使它不存在(EOF后)),因此您可以移动到新创建的文件中的任何位置并在该位置写入字节。您可以打开同一个文件的多个实例,并寻找不同的位置并同时写入多个位置。

相关问题