문제
나는 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()
이 되지 않을 수 있습니다 당신이 찾고있는 무엇,그러나의 관심에서 오는 문제를 다른 각도에서....
이러한 두 가지 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 를 사용하여 사용