Java를 사용하여 파일을 잠그는 방법(가능한 경우)
파일 리더를 사용하여 파일을 여는 Java 프로세스가 있습니다.다른 (Java) 프로세스에서 이 파일을 열지 못하도록 하거나 적어도 파일이 이미 열려 있음을 두 번째 프로세스에 통지하려면 어떻게 해야 합니까?파일이 열려 있는 경우(문제가 해결됨) 두 번째 프로세스가 자동으로 예외를 발생합니까?아니면 첫 번째 프로세스에서 플래그나 인수를 사용하여 파일을 명시적으로 열어야 합니까?
명확히 하기 위해:
폴더를 나열하고 목록에 있는 각 파일을 열어 처리하는 Java 앱을 가지고 있습니다.각 파일을 차례로 처리합니다.각 파일의 처리는 읽고 내용을 바탕으로 계산을 하는 것으로 이루어지며 약 2분 정도 소요됩니다.또 다른 자바 앱도 있습니다.이 앱은 같은 기능을 하지만 파일에 씁니다.제가 원하는 것은 이러한 앱을 동시에 실행할 수 있도록 시나리오가 다음과 같습니다.ReadApp은 폴더를 나열하고 파일 A, B, C를 찾습니다.그러면 파일 A가 열리고 판독이 시작됩니다.WriteApp은 폴더를 나열하고 파일 A, B, C를 찾습니다.파일 A를 열고 열려 있는 것을 확인하고(예외 또는 어떤 방법으로든), 파일 B로 이동합니다.ReadApp은 A 파일을 끝내고 B로 계속 진행합니다.오픈된 것을 확인하고 C까지 계속됩니다.ReadApp이 동일한 파일을 읽을 때 WriteApp이 쓰지 않거나 그 반대로 쓰지 않는 것이 중요합니다.그것들은 다른 프로세스입니다.
File Channel.lock이 필요할 수 있습니다.
try (
FileInputStream in = new FileInputStream(file);
java.nio.channels.FileLock lock = in.getChannel().lock();
Reader reader = new InputStreamReader(in, charset)
) {
...
}
(면책자:코드는 컴파일되어 있지 않으며 테스트되지 않았습니다.)
FileLock용 API 문서의 "플랫폼 의존관계" 섹션을 참조하십시오.
의 클래스를 사용하지 않음java.io
패키지 대신java.nio
패키지화 됩니다.후자는FileLock
class. 잠금을 적용할 수 있습니다.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(JDK 1.4 이상)를 사용할 수 있다면java.nio.channels.FileChannel.lock()
java.nio.syslog 를 사용합니다.파일 잠금과 java.nio.channels의 조합.파일 채널
이것이 당신이 찾고 있는 것은 아닐지도 모르지만, 다른 각도에서 문제에 임하기 위해….
이들 2개의 Java 프로세스는 같은 어플리케이션 내의 동일한 파일에 액세스하려고 하는 것입니까?단일 동기 방식(또는 JSR-166 사용)을 통해 파일에 대한 모든 액세스를 필터링할 수 있습니다.이렇게 하면 파일에 대한 액세스를 제어할 수 있으며 액세스 요청을 대기열에 넣을 수도 있습니다.
Random Access File을 사용하여 채널을 취득한 후 lock()을 호출합니다.입력 스트림 또는 출력 스트림에 의해 제공되는 채널에는 올바르게 잠글 수 있는 권한이 없습니다.마지막 블록에서 unlock()을 호출하십시오(파일을 닫는다고 해서 잠금이 해제되는 것은 아닙니다).
다음은 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();
}
}
}
winscp 또는 ftp를 사용하여 전송하는 경우 unix의 경우 다음과 같이 하십시오.
public static void isFileReady(File entry) throws Exception {
long realFileSize = entry.length();
long currentFileSize = 0;
do {
try (FileInputStream fis = new FileInputStream(entry);) {
currentFileSize = 0;
while (fis.available() > 0) {
byte[] b = new byte[1024];
int nResult = fis.read(b);
currentFileSize += nResult;
if (nResult == -1)
break;
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("currentFileSize=" + currentFileSize + ", realFileSize=" + realFileSize);
} while (currentFileSize != realFileSize);
}
언급URL : https://stackoverflow.com/questions/128038/how-can-i-lock-a-file-using-java-if-possible
'itsource' 카테고리의 다른 글
Windows에서 "Import Error: numpy라는 이름의 모듈이 없습니다"라는 오류가 발생함 (0) | 2022.11.26 |
---|---|
MySQL/MariaDB가 트랜잭션을 롤백하지 않음 (0) | 2022.11.26 |
JavaScript에서 정의되지 않은 변수 또는 null 변수를 확인하는 방법은 무엇입니까? (0) | 2022.11.26 |
특수한 포인터onCreate()의 뷰에 액세스하는 예외 (0) | 2022.11.26 |
도커 컨테이너 내에 PHP Composer를 설치하는 방법 (0) | 2022.11.26 |