문제

나는 Java 프로세스가 파일을 사용하여 FileReader.을 방지할 수 있는 방법이 다른(Java)프로세스에서 이 파일을 열거나,적어도 알리는 두 번째 프로세스하는 파일은 이미 열?이 자동으로 두 번째 과정 예외가 발생한 경우 파일을 열고(를 해결하는 나의 문제)하나 이상의 명시적으로 오픈에서 그것의 첫 번째 과정으로 어떤 종류의 논?

을 명확히:

I have a Java 나열하는 응용 프로그램 폴더가 열리는 각 파일 목록에 대한 처리습니다.그것은 프로세스는 각 파일습니다.의 처리를 각 파일의 구성 그것을 읽기와 일부 계산에 따라 내용물 및 그것은 2 분 정도 걸립니다.나는 또 다른 Java 않는 응용 프로그램 같은 일이지만,대신에 기록은 파일입니다.내가 원하는 것은 있을 수 있 다음 앱을 실행하도록 동시에 시나리오는 다음과 같이 진행됩니다.ReadApp 목록 폴더와 파일을 찾 A,B,C.그것을 열어 파일로 시작합니다.WriteApp 목록 폴더와 파일을 찾 A,B,C.그것을 열어 파일로,보고는 열(여 예외 또는 어떤 방법으로)그리고 간 파일 B.ReadApp 마감일을 계속하고 B.그것을 보고는 그것이 열리고 계속해 C.는 것이 중요 WriteApp 쓰지 않는 동안 ReadApp 을 읽고 같은 파일 또는 그 반대입니다.그들은 다른 프로세스입니다.

도움이 되었습니까?

해결책

FileChannel.잠금입니다 아마 당신이 무엇을 원합니다.

FileInputStream in = new FileInputStream(file);
try {
    java.nio.channels.FileLock lock = in.getChannel().lock();
    try {
        Reader reader = new InputStreamReader(in, charset);
        ...
    } finally {
        lock.release();
    }
} finally {
    in.close();
}

(면책 조항:코드를 컴파일하지 않았고 확실하게 테스트하지 않습니다.)

참고"라는 제목의 섹션 플랫폼에 종속성을"에 API doc 에 대한 FileLock.

다른 팁

를 사용하지 않는 클래스java.io 패키지 대신 사용 java.nio 패키지입니다.후자는 FileLock 클래스입니다.에 적용할 수 있는 자물쇠 FileChannel.

 try {
        // Get a file channel for the file
        File file = new File("filename");
        FileChannel channel = new RandomAccessFile(file, "rw").getChannel();

        // Use the file channel to create a lock on the file.
        // This method blocks until it can retrieve the lock.
        FileLock lock = channel.lock();

        /*
           use channel.lock OR channel.tryLock();
        */

        // Try acquiring the lock without blocking. This method returns
        // null or throws an exception if the file is already locked.
        try {
            lock = channel.tryLock();
        } catch (OverlappingFileLockException e) {
            // File is already locked in this thread or virtual machine
        }

        // Release the lock - if it is not null!
        if( lock != null ) {
            lock.release();
        }

        // Close the file
        channel.close();
    } catch (Exception e) {
    }

를 사용할 수 있는 경우 Java NIO (JDK1.4 또는 크이)다음,내 생각을 찾고 계신 java.nio.channels.FileChannel.lock()

FileChannel.잠금()

이 되지 않을 수 있습니다 당신이 찾고있는 무엇,그러나의 관심에서 오는 문제를 다른 각도에서....

이러한 두 가지 Java 프로세스에 액세스할 수 있습 같은 파일에 동일한 응용 프로그램?아마도 당신만 필터는 모든 파일에 대한 액세스를 통해 단일의 동기화 방식(또는,더 나은 사용하여, JSR-166)?는 방법으로 제어할 수 있습니다 이 파일에 대한 액세스,그리고 아마도 큐 액세스를 요청합니다.

사용 RandomAccessFile 을 얻을,그것은 채널,전화 잠금().채널에 의해 제공됩 입력 또는 출력 스트림을 수 있는 권한이 없을 잠급니다.를 호출해야 합니다금()에서 마지막으로 블록(파일을 닫지 않는 반드시한 잠금을 해제하).

내가 찾은 동일한 문제로 몇 년 전 제가 쓴 때는 응용 프로그램이 필요한 여러 사용자에 MacOS/Windows 을 공유하는 동일한 데이터를 여러 파일이 있습니다.파일을 잠그기에서 작동하지 않은 맥 os 그래서 내가 만들어 내 자신의'ioFile'클래스는 그 자체의 등록 파일에 액세스 열 r/o,열 r/w,etc.,과 사람'은유'다.이것이 유일한 방법은 시간에 수에 대한 액세스 제어에서 다른 사용자가 다른 시스템에서 사용하는 다른 OS 습니다.

아래의 예제 코드 조각을 파일 잠금까지의 과정에 의해 수행되 JVM.

 public static void main(String[] args) throws InterruptedException {
    File file = new File(FILE_FULL_PATH_NAME);
    RandomAccessFile in = null;
    try {
        in = new RandomAccessFile(file, "rw");
        FileLock lock = in.getChannel().lock();
        try {

            while (in.read() != -1) {
                System.out.println(in.readLine());
            }
        } finally {
            lock.release();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

에 넣으면 파일에 액세스 동기화된 블록,하나의 인스턴스의 쓰레드를 입력 할 수 있습으로 그것은,다른 사람은 기다릴 때까지,하나의 완료했습니다.

public class FileReader{
  public void read() {
    synchronized (this) {
      //put you file access here
    }
  }
}
package tips.javabeat.nio.lock;  

import java.io.*;  
import java.nio.channels.FileChannel;  
import java.nio.channels.FileLock;  

public class FileLockTest {  

    public static void main(String[] args) throws Exception {  

       RandomAccessFile file = null;  

         FileLock fileLock = null;  

         try 

         {  

             file = new RandomAccessFile("FileToBeLocked", "rw");  

             FileChannel fileChannel = file.getChannel();  



             fileLock = fileChannel.tryLock();  

             if (fileLock != null){  

                 System.out.println("File is locked");  

                 accessTheLockedFile();  

             }  

         }finally{  

             if (fileLock != null){  

                 fileLock.release();  

             }  

         }  

     }  



     static void accessTheLockedFile(){  

        try{  

         FileInputStream input = new FileInputStream("FileToBeLocked");  

          int data = input.read();  

            System.out.println(data);  

      }catch (Exception exception){  

             exception.printStackTrace();  
        }  

     }  

당신이는 자바를 사용합니다.nio.* Api 에 대해 잠금하는 파일입니다.그러나지 않는 보증 잠금,그것은 경우에 따라 달라집니다 기본 OS 잠금을 지원하거나지 않습니다. 제가 이해하기로는 와 같은 운영체제를 사용하는 리눅스 넣은 사람은 잠금을 지원하고 따라서 당신은 잠글 수 없는 경우에도 이러한 Api 를 사용하여 사용

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top