2017-01-05 4 views
1

클라이언트에서 파일을 다운로드하여 특정 위치로 이동시키는 자바 서블릿을 작성하고 있습니다. 이동 후 다운로드 한 파일을 삭제합니다. 때때로 리눅스는 .fuse_hidden ______ 명명 된 파일을 생성한다. 서버 프로세스가 재시작 될 때까지 그 위치에 남아 있습니다. 다운로드가 끝나면 열린 스트림을 모두 닫습니다. 일반적으로 마운트 된 USB 플래시 드라이브에서 발생합니다.삭제 시도 후 임시 파일이 계속됩니다.

여기 파일에 적어도 하나의 열린 파일 핸들이 여전히 있다는 것을 의미 내 코드

try{ 
      ... 
      inputStream = new RandomAccessFile(new File(sourcePath), "r"); 
      inputChannel = inputStream.getChannel(); 
      .... 
     } 
    finally{ 
      inputChannel.close(); 
      inputStream .close(); 
     } 
    new File(sourcePath).delete(); 
+0

예외가 있습니까? 예외가 발생하면 try, catch, finally 블록 외부에 있기 때문에 파일이 삭제되지 않습니다. – Michael

답변

1

입니다. 마지막 핸들이 닫히면 숨겨진 파일이 삭제됩니다.

당신은 당신이 서버를 죽일 때 사라진다 고 말합니다. 그러므로 당신의 서버는 여전히 하나 이상의 파일 핸들을 가지고 있습니다. lsof 명령을 사용하여 서버가 실제로 열린 핸들임을 증명할 수 있습니다.

성공 및 예외 상황에서 Java의 파일에 열려있는 모든 스트림을 닫고 있는지 확인하십시오.

+0

다운로드 코드를 살펴보면 다운로드 한 파일을 닫을 수있는 행은 다음과 같습니다. destinationOutputStream.close(); \t \t \t \t destinationOutputStream.flush(); 이것이 휴즈 파일의 원인이 될 수 있습니까? flush()가 close() 이후에 호출되고 있습니까? –

+0

닫힌 스트림을 플러시 할 수 없으므로 코드가 문제가됩니다. 이 논리 오류를 수정 한 후에 원래 핸들 문제는 사라지나요? –

+0

늦게 답장을 드려 죄송합니다. 수정으로 문제가 해결 된 것 같습니다. 몇 시간의 테스트 후에도 .fuse 파일을 보지 못했습니다. 감사! –