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
。