Java Can';当文件是参数时,不要删除它

Java Can';当文件是参数时,不要删除它,java,file,delete-file,Java,File,Delete File,我将把我的代码放在第一位: @Post public Representation post(InputStream zip) throws Throwable { createFile(zip, "C:/temp\abc.zip"); return new StringRepresentation("File uploaded"); } public void createFile(InputStream zipStream, uploadedFileLocation

我将把我的代码放在第一位:

@Post
public Representation post(InputStream zip) throws Throwable {
    createFile(zip, "C:/temp\abc.zip");
    return new StringRepresentation("File uploaded");
}    

public void createFile(InputStream zipStream, uploadedFileLocation) throws Exception {
    try {
        writeToFile(zipStream, uploadedFileLocation);
        FileUtils.forceDelete(new File(uploadedFileLocation));
        } catch (Exception e) {
             throw e;
        }
}


private void writeToFile(InputStream uploadedInputStream, String uploadedFileLocation) {
    try {
        OutputStream out = new FileOutputStream(new File(uploadedFileLocation));
        int read = 0;
        byte[] bytes = new byte[1024];

        out = new FileOutputStream(new File(uploadedFileLocation));
        while ((read = uploadedInputStream.read(bytes)) != -1) {
            out.write(bytes, 0, read);
        }
        out.flush();
        out.close();
        uploadedInputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
我正在尝试制作一个允许用户上传zip文件的服务器。然后服务器将zip文件写入磁盘,解压,然后删除zip,同时将解压部分保留在服务器上。但是,当我将zip文件发送到服务器时,它无法被删除。使用
FileUtils.forceDelete()
时,它表示无法删除该文件。解压后删除zip非常理想


编辑:我只能在
post(InputStream zip)
返回后删除文件。如果我在
post
方法中调用delete,它将不会删除,因为post尚未返回。有办法解决这个问题吗?

我想你的问题可能是因为你使用了“C:/temp”而不是“C:/temp/fileName”,所以你最终尝试删除了一个你可能没有权限的文件夹。

嗯。看来你是在尝试删除一个目录

FileUtils.forceDelete(new File(uploadedFileLocation));
但是
uploadedFileLocation
post
方法中的“C:\temp”。我不确定这是否会导致问题,或者这是否是预期行为,但该代码没有删除zip文件,并且正在尝试删除实际的C:\temp目录


另外,可能值得注意的是:在
writeToFile
方法中,您正在初始化
OutputStream out
两次。我并不是百分之百同意这一点,但第一次初始化可能是保持文件指针打开,直到整个对象从堆栈中删除(即,当
post
返回时)。执行第二次初始化,查看是否发生任何更改?

您不需要使用文件位置,为什么不使用实际文件?
将文件作为参数传递,然后执行
file.delete()当您完成时。

如果问题不是您试图删除目录,那么您试图删除的文件很可能仍处于打开状态。在Windows上,这意味着将阻止您删除该文件

从外观上看,您的
writeToFile
方法将文件打开两次。。。但只关闭一次。我怀疑这意味着它将泄漏一个文件描述符,操作系统会认为应用程序仍在使用该文件



原来我应该调用file.delete();而不是使用FileUtils


我不这么认为。当然,不会因为文件未被删除而出现异常。但是,
File.delete()
将返回
false
,您的应用程序将把文件留在文件系统中。从长远来看,情况可能会更糟,除非您有其他方法来清除孤立文件。

对不起,我不小心遗漏了它。现在那里实际上有一个文件名
C:/temp/abc.zip
在这种情况下,我仍然倾向于使用双重初始化的输出流,该流可能会将该位置的文件保持为打开状态,直到对象脱离堆栈。我不熟悉FileUtils库,但我知道
java.io.File
类有自己的删除函数。如果第一种方法不起作用,请尝试
新建文件(fileUploadLocation).delete()
。另外,当它失败时,您是否会收到异常消息?如果是这样,你能把它添加到你的帖子中吗?原来我应该调用
file.delete()而不是使用
FileUtils