2014-10-13 2 views
1

멀티 파트 데이터를 읽고 파일을 임시 위치에 저장하는 서블릿이 있습니다. 그런 다음 ejb stateless 서비스를 호출합니다.이 서비스 중 하나는 파일 경로를 문자열 인수로 사용합니다. 서비스에서 여러 가지 이유로 예외에서 파일을 삭제하는 방법

나는

  1. 우편/타르/Z 파일로 파일 형식을 확인합니다. 유효한 아카이브가 아닌 경우 RuntimeException을 발생시킵니다.
  2. 그런 다음/untar/unZ을 압축 해제하고 특정 xml 파일이 있는지 확인하십시오. 파일이 아카이브에 없으면 RuntimeException을 던져
  3. 그런 다음 JAXB를 사용하여 XML을 언 마샬링합니다. 어떤 이유로 인해 unmarshal이 실패하면 RuntimeException을 던집니다.
  4. 그런 다음 비 정렬 화 된 개체를 데이터베이스에 저장합니다.
  5. 그런 다음 클라이언트로 성공을 보내기 전에 파일을 삭제합니다.

서비스의 여러 위치에서 file.delete()를 호출하지 않아도 어떻게 효율적으로 수행 할 수 있습니까?

다음은 내가 같은이

내가 거래에 대해 잘 모르는의 압축을 풉니 다

함께 Unzipper

에서 그것을
ZipEntry entry = zipFile.getEntry("descriptor.xml"); 
if(entry == null) { 
    file.delete(); 
    throw new RuntimeException("descriptor xml not found"); 
} 

... service() { 

    extractDescriptor(filePath); 
} 

... extractDescriptor(String filePath) { 
    String extension = filePath.substring(filePath.lastIndexOf(".") + 1).toLowerCase(); 
    switch(extension) { 
     case "zip": 
     unzipper.extractFromZip(filePath); 
     break; 
     case "tar": 
     untar.extractFromTar(filePath); 
     break; 
     case "z": 
     untar.extractFromZ(filePath); 
     break; 
     default: 
     new File("filePath").delete(); 
     throw RuntimeException("invalid extention"); 
    } 
} 

을 작성하는 방법을 일부 원시 코드입니다. 아무도 나를 도울 수 있습니까?

+0

try catch에 5 단계를 모두 포함하고 finally에서 delete를 실행하지 않는 이유는 무엇입니까? try-catch-finally 블록 외부에서 성공을 거두십시오. –

+0

그래, 그 생각이 있었지만 시도와 잡기가 코드를 추악하게 만들 것이며 트랜잭션을 사용하는 더 좋은 방법이 있다면 생각했습니다. –

답변

2

extractDescriptor()의 몸체를 try/finally에 마지막으로 넣으십시오. new file(filePath).delete();을 finally 블록에 넣으십시오. 그런 다음 파일을 정상적으로 종료했는지 (파일을 사용하여 완료했는지) 또는 예외를 throw하는지 여부에 관계없이 파일이 삭제됩니다.

관련 문제