2014-05-10 2 views
1

파일을 관리하고 잠금하려면 NIO 파일 채널을 사용하고 있습니다. 지금까지는 작동하지만 NIO 파일 잠금을 사용하여 파일을 잠그면 파일 내용을 변경할 수 없도록 파일을 잠급니다. 예를 들어 메모장에서 텍스트 파일을 편집하려고하면 다음과 같은 오류 메시지가 표시됩니다. File LockNIO 패키지를 사용하여 파일을 잠그지 않는 방법

그리고 예상되는 결과이지만 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을 만듭니다. 사용 File Open Message

코드 : :이 사용하는 경우에만 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 패키지에 있습니다.

+0

: IO 패키지에있는 클래스를 사용하여 함께 문제가 무엇인가? –

+0

그러나 문제는 없지만 NIO 외에도 다른 패키지를 사용하거나 가져 오는 것을 피하고 싶습니다. 'FileChannel.open'을 사용하여 파일 채널을 열고이 클래스를 사용하면 나에게 잠금을 제공 할 수 있습니다. 그러나 'FileDescriptor'로 핸들을 여는 옵션이 없으면 nio 만 사용하는 것이 가능하거나 코드를 사용하여 핸들을 열고 사용자 또는 다른 응용 프로그램이 RAF 또는 IO 패키지 내의 클래스를 사용하는 것 이외의 다른 파일을 삭제하지 않도록 할 수 있습니다. 너의 대답에 대해 – Silencio2

답변

1

삭제를 방지하기 위해 FileLock이 지정되지 않았습니다. 다른 파일 잠금과 상호 작용하는 경우에만 지정되므로 플랫폼 의존적 인 동작에 이미 깊이 관여하고 있습니다. RandomAccessFile이 어떻게 든 당신이 원하는대로하면 당신은 그것에 갇혀 있을지 모르지만 당신은 그것에 의존 할 수 없습니다.

NB FileChannel.open은() FileDescriptor에가, 처리 사용합니다 물론, 등 단지 호기심

+0

고마워. FileLock이 삭제를 방지하지 않는다는 것을 알고 있습니다. 그러나 그것은 또한 원하는 기능과 행동을 제공하기 때문에 사용되었습니다. 나는 주위에 아무런 방법이 없을 수도 있지만 파일을 지울 수 없도록 FileDescriptor 또는 핸들이 파일을 "열어 둘"수 있도록하는 옵션이 있습니까? Open Option은이 경우에 사용할 수 있습니다 ... 아마도 JRE의 새로운 기능으로 요청해야합니까? 유용한 것으로 입증 될 수 있습니다. – Silencio2

관련 문제