如何在java中完成线程后删除文件?

时间:2015-04-14 11:16:38

标签: java multithreading javamail

我正在尝试发送带附件的邮件。我正在使用javamail api来执行此操作。由于多个用户可以同时发送邮件,因此我创建了一个线程以确保其安全。我可以使用file.delete()函数删除文件,该函数在邮件附件完成之前发生。但我发送附件/邮件后无法删除该文件。请帮我解决这个问题。

以下是我用来附加和发送邮件的代码:

public void sendMailWithAttachment(String from, final String to, final String subject, final String msg, final String filePath) {
    Thread ty = new Thread(){
        public void run(){
            MimeMessage message = mailSend.createMimeMessage();

             try{
                MimeMessageHelper helper = new MimeMessageHelper(message, true);

                //helper.setFrom(from);
                helper.setTo(to);
                helper.setSubject(subject);
                helper.setText(msg);

                FileSystemResource file = new FileSystemResource(filePath);
                helper.addAttachment(file.getFilename(), file);

         //I want to write code to delete the file here

             }catch (MessagingException e) {
                 throw new MailParseException(e);
             }
             mailSend.send(message);
        }
    };
    ty.start();
 }

3 个答案:

答案 0 :(得分:1)

无论如何,你正在初始化你的Thread实现。你可以覆盖Thread实现的finalize()方法,当Thread对象即将被垃圾收集时,它会被调用。

代码如下所示:

Thread ty = new Thread(){
    public void run(){
            // do mail sending stuff here.
    }

    @Override
    protected void finalize() throws Throwable {
        // delete file here
    }
};
ty.start();

答案 1 :(得分:0)

您有多种方法可以执行此任务,我建议您使用第二个

1)启动该文件,然后如果您的java环境对该文件夹具有更正权限,则可以删除该文件,如下所示

try{

            File file = new File("filePath");

            if(file.delete()){
                System.out.println("Deleted file: " + file.getName());
            }else{
                System.out.println("Delete failed on file ": + file.getName());
            }

        }catch(Exception e){

            e.printStackTrace();

        }

2)您也可以使用通用类文件

try {
    Files.delete(path);
} catch (NoSuchFileException x) {
    System.err.format("%s: no such" + " file or directory%n", path);
} catch (DirectoryNotEmptyException x) {
    System.err.format("%s not empty%n", path);
} catch (IOException x) {
    // File permission problems are caught here.
    System.err.println(x);
}

如果您在删除文件时遇到问题,可能是因为FileSystemResource指向该文件,尝试使用

完成该对象
file.finalize()

看一下这个问题来完成Threads

How to know if other threads have finished?

答案 2 :(得分:0)

在发送操作后删除finally块中的文件。