java - 即使关闭流后也无法删除文件

标签 java file apache-poi inputstream fileoutputstream

我正在尝试从 URL 打开文件,将其复制到临时文件,然后在处理工作完成后删除临时文件。但是,我无法删除该文件。我尝试过关闭所有流,我尝试过使用deleteOnExit() 方法和Delete() 方法进行删除。这是我正在使用的 Excel 文件。当我不使用 Excel 文件时,或者更具体地说,当我不使用 Workbook 对象(如下面的代码所示)时,该文件删除得很好。一旦我将文件传递给 workbookFactory.create() 方法,代码就无法删除我的文件。

下面是代码:

public class URLtoFileWriting {

/**
 * @param args the command line arguments
 * @throws java.io.IOException
 */

static File destinationFile;
public static void getFile() throws IOException {

    try {
        // TODO code application logic here

        URL fileURL = new URL("http://www.testURL.com/testfile.xlsx");
        URLtoFileWriting.destinationFile = File.createTempFile("remotefile",".xlsx");

        try {
            URLConnection URLconnection = fileURL.openConnection();
            InputStream inputStream = URLconnection.getInputStream();
            FileOutputStream fileoutputStream = new FileOutputStream(URLtoFileWriting.destinationFile);
            IOUtils.copy(inputStream, fileoutputStream);

            Workbook wb = WorkbookFactory.create(URLtoFileWriting.destinationFile);

            System.out.println(URLtoFileWriting.destinationFile.getAbsolutePath());
            inputStream.close();
            fileoutputStream.close();
            System.out.println("Deleted testWB?!" + URLtoFileWriting.destinationFile.delete());



        } catch (IOException ex) {
            Logger.getLogger(URLtoFileWriting.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvalidFormatException ex) {
            Logger.getLogger(URLtoFileWriting.class.getName()).log(Level.SEVERE, null, ex);
        }


    } catch (MalformedURLException ex) {
        Logger.getLogger(URLtoFileWriting.class.getName()).log(Level.SEVERE, null, ex);
    }


}

}

我正在使用的所有导入:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.io.IOUtils;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

我怀疑这与 workbookFactory.create() 方法有关,因为一旦我将文件传递给此方法,删除就不可能了。

我在这里做错了什么?

更新。我遇到了一个修复: 您可以将 File 传递给 FileInputStream,然后将此流传递给 WorkbookFactory.Create() 方法。

更新了下面的代码以反射(reflect)这一点:

  import java.io.File;
  import java.io.FileInputStream;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.net.MalformedURLException;
  import java.net.URL;
  import java.net.URLConnection;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  import org.apache.commons.io.IOUtils;
  import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
  import org.apache.poi.ss.usermodel.Workbook;
  import org.apache.poi.ss.usermodel.WorkbookFactory;


 public class URLtoFileWriting {

/**
 * @param args the command line arguments
 * @throws java.io.IOException
 */

static File destinationFile;
public static void getFile() throws IOException {

    try {
        // TODO code application logic here

        URL fileURL = new URL("http://www.testURL.com/testfile.xlsx");
        URLtoFileWriting.destinationFile = File.createTempFile("remotefile",".xlsx");

        try {
            URLConnection URLconnection = fileURL.openConnection();
            InputStream inputStream = URLconnection.getInputStream();
            FileOutputStream fileoutputStream = new FileOutputStream(URLtoFileWriting.destinationFile);
            IOUtils.copy(inputStream, fileoutputStream);

            FileInputStream FIS = new FileInputStream(URLtoFileWriting.destinationFile);
            Workbook wb = WorkbookFactory.create(FIS);
            FIS.close();
            inputStream.close();
            fileoutputStream.close();
            System.out.println(URLtoFileWriting.destinationFile);
            System.out.println(URLtoFileWriting.destinationFile.delete());



        } catch (IOException ex) {
            Logger.getLogger(URLtoFileWriting.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvalidFormatException ex) {
            Logger.getLogger(URLtoFileWriting.class.getName()).log(Level.SEVERE, null, ex);
        }


    } catch (MalformedURLException ex) {
        Logger.getLogger(URLtoFileWriting.class.getName()).log(Level.SEVERE, null, ex);
    }


}

}

我希望这会有所帮助。

最佳答案

在此处查找解决方案 Close Filehandle for Workbook (apache poi) .

使用NPOIFSFileSystem#close()OPCPackage#close() .

有关更多信息,请查看 WorkbookFactory 的重载构造函数。类。

关于java - 即使关闭流后也无法删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23161934/

相关文章:

java - 不区分大小写的消息

python - 语法错误 : unexpected character after line continuation character in python

java - 使用java生成excel并在excel中创建宏

java - Apache POI HSSF XLS 读取错误

java - Apache POI 在电子表格中仅记录 1 行

java - JMockit - 期望 - 匹配调用包含模拟对象作为参数的方法

java - 如何在 Eclipse 中找到抽象方法的实现位置?

java - Gradle似乎忽略了项目依赖

file - 文本编辑器如何插入文本?

iphone - 更改 Xcode 文件模板中的大小写?