2012-07-17 5 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하지만, 모두가 하나가 여기에 파일을 writting되는 때입니다. 행운을 빌리지 않고 이전 답변에서 제안한대로 재시도 방법을 시도했습니다. 어떤 도움이라도 대단히 감사하겠습니다.

+0

데이터베이스 엔진? – Randy

+0

쓰기시 복사 ?? – Joel

답변

3

당신이 어떤 종류의 OS 수준의 파일 잠금을 사용하여 잠금 당신 '을 확인하지 않는 한 이 작업을 안정적으로 수행 할 수는 없습니다. 이것을 관리하는 상당히 신뢰할 수있는 방법은 디렉토리의 다른 파일을 세마포어로 사용하는 것입니다. 세마포어를 작성하거나 읽거나 끝낼 때 파일을 "터치"할 때 "터치"하십시오. 파일에 액세스하기 전에 세마포어가 있는지 확인하십시오. 그렇지 않으면 일종의 데이터베이스를 사용하여 파일 잠금 (일관성 보장)을 저장하고 거기에 대해 확인해야합니다.

그렇다면이 프로그램을 하나의 프로그램으로 결합해야합니다.

0

파일을 수정하는 메서드에서 synchronized을 사용하십시오.

편집 : 클래스 상기 된 스레드 안전 클래스의이 방법의 해상력은 당 같이 .. "

그것을 기본 OS 인터리빙의 존재 하에서 정확하게 동작하는 스레드 안전 할 그리고 클라이언트 측에서 동기화 메커니즘을 사용하지 않고 스케줄링하는 것 ".

다른 컴퓨터에 액세스 할 수있는 File이 있다고 생각합니다. 따라서 클라이언트 - 서버 메커니즘이 있어야합니다. 그렇다면 서버 측에 동기화 메커니즘이 있고 그 다음에는 그렇지 않습니다. 문제에 얼마나 많은 클라이언트 액세스가 ...

가없는 경우, 동기화 충분하다 ........

+0

프로그램이 별도의 VM에서 실행되고 있는데 어떻게 도움이 될까요? –

+0

수정 된 부분보기 –

+0

그가 다른 기계라고 말한 곳을 볼 수 없습니다. –

0

시도 RandomAccessFile.

이것은 유용하지만 매우 위험합니다. 위험한 기능입니다. 이것은 "당신이 파일의 다른 부분에 동시에 쓸 수있는 동일한 파일에 대해 RandomAccessFile의 다른 인스턴스를 만드는 경우"와 같이 이어집니다.
seek 메서드를 사용하여 파일의 다른 부분을 가리키는 여러 스레드를 만들 수 있으며 여러 스레드가 동시에 파일을 업데이트 할 수 있습니다. Seek은 (EOF 이후에) 존재하지 않더라도 파일의 모든 부분으로 이동할 수있게하므로 새로 생성 된 파일의 모든 위치로 이동하고 해당 위치에 바이트를 쓸 수 있습니다. 동일한 파일의 여러 인스턴스를 열고 서로 다른 위치를 찾고 동시에 여러 위치에 쓸 수 있습니다.

관련 문제