2012-07-17 32 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後)),因此您可以移動到新創建的文件中的任何位置並在該位置寫入字節。您可以打開同一個文件的多個實例,並尋找不同的位置並同時寫入多個位置。

相關問題