如何出于多种原因删除异常文件

时间:2014-10-13 15:23:44

标签: java file-io transactions

我有一个servlet,它读取多部分数据并将文件保存到某个临时位置。然后调用ejb无状态服务,其中一个方法将文件路径作为字符串参数。

在服务中我检查

  1. 文件类型为zip / tar / Z文件。如果不是有效的存档,则抛出RuntimeException。
  2. 然后解压缩/解压缩/解压缩并检查是否存在特定的xml文件。如果档案中没有文件,则抛出RuntimeException
  3. 然后我使用JAXB来解组xml。如果unmarshal由于任何原因而失败,我会抛出RuntimeException。
  4. 然后我将unmarshalled对象保存到数据库中。
  5. 然后在将成功返回给客户端之前删除该文件。
  6. 如何在不必从服务中的多个位置调用file.delete()的情况下有效地执行此操作?

    下面是我写的一些原始代码

    ... 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");
        }
    }
    

    在Unzipper中

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

    与Untar相同

    我对交易知之甚少。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:2)

extractDescriptor()的正文包裹在try/finally中,并在finally块中加new file(filePath).delete();。无论你是否正常退出(并使用该文件完成)或抛出异常,该文件都将被删除。