如何在Java中关闭和删除文件

如何在Java中关闭和删除文件,java,Java,我已经编写了应保存在本地目录中的文件的代码,创建该文件的zip,发送电子邮件并删除这两个文件(原始文件和zip),因此这是我的代码: 发送电子邮件的方法 public void sendEmail(Properties emailProperties, InputStream inputStream, HttpServletRequest request) throws UnsupportedEncodingException { MimeMessage mimeMessage =

我已经编写了应保存在本地目录中的文件的代码,创建该文件的zip,发送电子邮件并删除这两个文件(原始文件和zip),因此这是我的代码:

发送电子邮件的方法

public void sendEmail(Properties emailProperties, InputStream inputStream, HttpServletRequest request) throws UnsupportedEncodingException {


    MimeMessage mimeMessage = mailSender.createMimeMessage();
    try {
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
        try {
            mimeMessageHelper.setFrom(from, personal);
        } catch (UnsupportedEncodingException e) {
            LOGGER.error(e.getMessage());
            throw new SequelException(e.getMessage());
        }

            mimeMessageHelper.setTo(recipients);
            mimeMessageHelper.setSubject(emailProperties.getProperty(PARAM_TITLE));             
            String message = emailProperties.getProperty(PARAM_EMLMSG);         
            mimeMessageHelper.setText(message);


            InputStreamSource inputStreamSource = null;
            if (inputStream != null) {
                inputStreamSource = new ByteArrayResource(IOUtils.toByteArray(inputStream));
            } 

            String compressType = COMPRESS_TYPE_ZIP;
            String fileName = getAttachFilenameExtension(object, format);
            Path filePath = Paths.get(StrUtils.getProperty("temp.email.files.path") + "\\" + fileName);
            tempFile = saveTempFile(inputStreamSource.getInputStream(), filePath);
            if (tempFile.length() > 0) {
                inputStreamSource = compressFile(tempFile, filePath.toString(), compressType);
                fileName = StringUtils.substring(fileName, 0, StringUtils.lastIndexOf(fileName, ".")+1)  + compressType;
            }

            mimeMessageHelper.addAttachment(fileName, inputStreamSource);
            mailSender.send(mimeMessage);


    } catch (MessagingException | IOException e) {
        LOGGER.error(e.getMessage());
        throw new SequelException(e.getMessage());
    } finally {
        List<File> files = (List<File>) FileUtils.listFiles(tempFile.getParentFile(), new WildcardFileFilter(
                FilenameUtils.removeExtension(tempFile.getName()) + "*"), null);
        for (File file : files) {
            try {
                FileUtils.forceDelete(file);
            } catch (IOException e) {
                LOGGER.error(e.getMessage());
            }
        }
    }
} 
压缩文件:

private InputStreamSource compressFile(File file, String filePath, String compressType) throws IOException {
    InputStream is = ZipFile(file, filePath);
    InputStreamSource inputStreamSource = new ByteArrayResource(IOUtils.toByteArray(is));
    return inputStreamSource;
}

public InputStream ZipFile(File file, String filePath) {
    String zipArchiveFileName = StringUtils.substring(filePath, 0, filePath.lastIndexOf(".") + 1) + COMPRESS_TYPE_ZIP;

    try (ZipArchiveOutputStream zipOutput = new ZipArchiveOutputStream(new File(zipArchiveFileName));) {
        ZipArchiveEntry entry = new ZipArchiveEntry(StringUtils.overlay(file.getName(), "",
                StringUtils.lastIndexOf(file.getName(), "_"), StringUtils.lastIndexOf(file.getName(), ".")));
        zipOutput.putArchiveEntry(entry);
        try (FileInputStream in = new FileInputStream(file);) {
            byte[] b = new byte[1024];
            int count = 0;
            while ((count = in.read(b)) > 0) {
                zipOutput.write(b, 0, count);
            }
            zipOutput.closeArchiveEntry();
        }

        InputStream is = new FileInputStream(zipArchiveFileName);
        return is;

    } catch (IOException e) {
        LOGGER.error("An error occurred while trying to compress file to zip", e);
        throw new SequelException(e.getMessage());
    }

}
所以问题是当我试图删除文件,但zip文件不删除。 我正在使用ApacheCommonsCompress进行压缩。
你能帮个忙吗

对我来说,这段代码工作得很好。压缩后,您可能试图删除它而不使用扩展名(例如这里的7z)

输出:-

成功地删除了该文件


我不明白你的问题。你是说创建的zip文件最终不会被删除吗?应该删除该文件的代码在哪里?压缩后需要提供扩展名。这可能是它不删除这些压缩文件的原因。
Files.deleteIfExists(filePath)这就是deletionEddyG delete部分是在finally块中编写的,它对我不起作用。我认为stream not closed(流未关闭)这就是文件未被删除的原因,因为当我尝试手动删除文件时,它会发出以下消息:“操作无法完成,因为文件夹是在Java Platform SE binary中打开的”@Suzan Yes,在尝试删除之前必须关闭它。请在关闭流后再试一次。流将保持文件打开,因为它无法删除它。
private InputStreamSource compressFile(File file, String filePath, String compressType) throws IOException {
    InputStream is = ZipFile(file, filePath);
    InputStreamSource inputStreamSource = new ByteArrayResource(IOUtils.toByteArray(is));
    return inputStreamSource;
}

public InputStream ZipFile(File file, String filePath) {
    String zipArchiveFileName = StringUtils.substring(filePath, 0, filePath.lastIndexOf(".") + 1) + COMPRESS_TYPE_ZIP;

    try (ZipArchiveOutputStream zipOutput = new ZipArchiveOutputStream(new File(zipArchiveFileName));) {
        ZipArchiveEntry entry = new ZipArchiveEntry(StringUtils.overlay(file.getName(), "",
                StringUtils.lastIndexOf(file.getName(), "_"), StringUtils.lastIndexOf(file.getName(), ".")));
        zipOutput.putArchiveEntry(entry);
        try (FileInputStream in = new FileInputStream(file);) {
            byte[] b = new byte[1024];
            int count = 0;
            while ((count = in.read(b)) > 0) {
                zipOutput.write(b, 0, count);
            }
            zipOutput.closeArchiveEntry();
        }

        InputStream is = new FileInputStream(zipArchiveFileName);
        return is;

    } catch (IOException e) {
        LOGGER.error("An error occurred while trying to compress file to zip", e);
        throw new SequelException(e.getMessage());
    }

}
public static void main(String[] args) {
    File file = new File("C:\\Users\\kh1784\\Desktop\\Remote.7z");
    file.delete();
    if(!file.exists())
        System.out.println("Sucessfully deleted the file");
}