파일을 관리하고 잠금하려면 NIO 파일 채널을 사용하고 있습니다. 지금까지는 작동하지만 NIO 파일 잠금을 사용하여 파일을 잠그면 파일 내용을 변경할 수 없도록 파일을 잠급니다. 예를 들어 메모장에서 텍스트 파일을 편집하려고하면 다음과 같은 오류 메시지가 표시됩니다. NIO 패키지를 사용하여 파일을 잠그지 않는 방법
그리고 예상되는 결과이지만 Windows 탐색기에서 파일을 삭제하려고하면 t 가능성 그것은 나를 수)도 가능할 것이다 다른 OS에서 테스트, 이것은이 파일이
코드 사용 처리 열 수 있는지 알고 싶습니다, 바람직하지 :
private static final byte[] MessageBytes;
static {
byte tmp[];
try {
tmp = "Hello World".getBytes("UTF-8");
} catch (UnsupportedEncodingException ex) {
//if fail get the bytes in whatever the java VM charset sets as default
tmp = "Hello World".getBytes();
}
MessageBytes = tmp;
}
private static final String Filename = "Lock_test.txt";
private static void createFileandLock() {
Path FilePath = Paths.get(Filename);
FileChannel OpenFCh;
try {
OpenFCh = FileChannel.open(FilePath, StandardOpenOption.CREATE,
StandardOpenOption.READ, StandardOpenOption.WRITE
// ,StandardOpenOption.APPEND
);
System.out.println("File Channel is Open.");
} catch (IOException err) {
OpenFCh = null;
}
if (OpenFCh != null) {
FileLock Lock = null;
try {
Lock = OpenFCh.lock();
} catch (IOException err) {
System.out.println("Unable To Lock the File.");
}
try {
OpenFCh.write(ByteBuffer.wrap(MessageBytes));
OpenFCh.force(false);
System.out.println("Message Recorded");
} catch (IOException ex) {
System.out.println("Unable To write data into file");
}
try {
// at this point file still locked and open.
//lets wait for input and meanwhile ask to delete the file.
System.out.print("Please Try to delete file at: ");
System.out.println(FilePath.toString());
System.out.println("Press Enter to Continue");
System.in.read();
} catch (IOException ex) {
}
if (Lock != null) {
try {
Lock.close();
} catch (IOException ex) {
}
}
try {
OpenFCh.close();
} catch (IOException ex) {
}
}
}
추가 연구 후에 나는 RandomAccessFile을 사용하여 삭제를 피하는 파일을 잠글 것입니다. 기본적으로 Operative 시스템 밑줄에 Handle을 열어 File Descriptor을 만듭니다. 사용
코드 : :이 사용하는 경우에만 NIO을 보관 가능한 경우 싶습니다 그러나
private static void createRAFileandLock() {
RandomAccessFile RAf;
try {
RAf = new RandomAccessFile(Filename, "rw");
} catch (FileNotFoundException ex) {
//since is open as RW shold not trigger.
RAf = null;
}
if (RAf != null) {
FileChannel OpenFCh = RAf.getChannel();
FileLock Lock = null;
try {
Lock = OpenFCh.lock();
} catch (IOException err) {
System.out.println("Unable To Lock the File.");
}
try {
OpenFCh.write(ByteBuffer.wrap(MessageBytes));
OpenFCh.force(false);
System.out.println("Message Recorded");
} catch (IOException ex) {
System.out.println("Unable To write data into file");
}
// at this point file still locked and open.
//lets wait for input and meanwhile ask to delete the file.
try {
System.out.print("Please Try to delete file at: ");
System.out.println(Filename);
System.out.println("Press Enter to Continue");
System.in.read();
} catch (IOException ex) {
}
if (Lock != null) {
try {
Lock.close();
} catch (IOException ex) {
}
}
try {
OpenFCh.close();
RAf.close();
} catch (IOException ex) {
}
}
}
알고 그래서 영국 공군을 사용하여 원하는 결과를 제공한다. 랜덤 액세스 파일은 IO 패키지에 있습니다.
: IO 패키지에있는 클래스를 사용하여 함께 문제가 무엇인가? –
그러나 문제는 없지만 NIO 외에도 다른 패키지를 사용하거나 가져 오는 것을 피하고 싶습니다. 'FileChannel.open'을 사용하여 파일 채널을 열고이 클래스를 사용하면 나에게 잠금을 제공 할 수 있습니다. 그러나 'FileDescriptor'로 핸들을 여는 옵션이 없으면 nio 만 사용하는 것이 가능하거나 코드를 사용하여 핸들을 열고 사용자 또는 다른 응용 프로그램이 RAF 또는 IO 패키지 내의 클래스를 사용하는 것 이외의 다른 파일을 삭제하지 않도록 할 수 있습니다. 너의 대답에 대해 – Silencio2