Java 即使在关闭流之后也无法删除文件
我试图从URL打开一个文件,将其复制到一个临时文件,然后在处理工作完成后删除该临时文件。但是,我无法删除该文件。我尝试过关闭所有流,我尝试过使用deleteOnExit()方法和Delete()方法进行删除。这是我正在使用的excel文件。当我不使用excel文件,或者更具体地说,不使用下面代码中所示的工作簿对象时,该文件可以很好地删除。一旦我将文件传递给workbookFactory.create()方法,代码就无法删除我的文件 下面是代码:Java 即使在关闭流之后也无法删除文件,java,file,apache-poi,inputstream,fileoutputstream,Java,File,Apache Poi,Inputstream,Fileoutputstream,我试图从URL打开一个文件,将其复制到一个临时文件,然后在处理工作完成后删除该临时文件。但是,我无法删除该文件。我尝试过关闭所有流,我尝试过使用deleteOnExit()方法和Delete()方法进行删除。这是我正在使用的excel文件。当我不使用excel文件,或者更具体地说,不使用下面代码中所示的工作簿对象时,该文件可以很好地删除。一旦我将文件传递给workbookFactory.create()方法,代码就无法删除我的文件 下面是代码: public class URLtoFileWri
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()方法有关,因为一旦我将文件传递给此方法,删除就不可能了
我做错了什么
更新。我遇到了一个问题:
您可以将该文件传递给FileInputStream,然后将该流传递给WorkbookFactory.Create()方法
更新了以下代码以反映这一点:
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);
}
}
}
我希望这能有所帮助。在这里找到解决方案
使用或
有关更多信息,请查看类的重载构造函数。只是猜测:在将文件对象传递给
WorkbookFactory之前关闭流。创建方法。我假设工厂将自己创建所需的输入流,并且您有一个阻止输入的输出流file@dimoniy,我刚试过这个。恐怕不行,我在附近找到了工作。显然,您可以将该文件传递给FileInputStream,然后将该FileInputStream传递给WorkbookFactory.Create()方法。我将更新上面的代码以反映这一点。谢谢你的帮助。我看了你的更新代码。我给了我java.lang.IllegalArgumentException:您的InputStream既不是OLE2流,也不是OOXML流
我希望我可以投票,但我还不被允许。所以我要说谢谢你的帮助!别担心。我只是来帮你的。我看了你的更新代码。我给了我java.lang.IllegalArgumentException:您的InputStream既不是OLE2流,也不是OOXML流
我再次更新了代码。这次是和全班同学一起。尝试复制粘贴,看看会发生什么。编辑:我以前也遇到过这个问题,我必须为ApachePOI导入所有库。