我正在从servlet (output.txt
)和XSL文件(文件夹generatedApps
及其内容)生成一些文件,然后将XSL转换生成的文件和文件夹打包到ZIP归档文件中。在客户端下载ZIP归档文件后,我想删除它,以及其他文件和文件夹。
这是我的代码:
InputStream inputStream = new ByteArrayInputStream(request.getParameter("content")
.getBytes("UTF-8"));
try {
TransformerFactory tFactory = new net.sf.saxon.TransformerFactoryImpl();
Transformer transformer = tFactory.newTransformer(new StreamSource(
getServletContext().getResourceAsStream("lib/GenerateGeddyJsCode.xsl")));
FileOutputStream fos = new FileOutputStream("output.txt");
transformer.transform(new StreamSource(inputStream), new StreamResult(fos));
String appName = new Scanner(new File("output.txt")).useDelimiter("\Z").next();
ZipUsingJavaUtil zipper = new ZipUsingJavaUtil();
zipper.zipFiles("generatedApps/" + appName, "generatedApps/" + appName + "Archive.zip");
String path = "generatedApps/";
String fileName = appName + "Archive.zip";
File f = new File(path + fileName);
response.setContentType("application/zip");
response.setContentLength((int)f.length());
response.addHeader("Content-Disposition","attachment;filename="" + fileName + """);
byte[] arBytes = new byte[32768];
FileInputStream is = new FileInputStream(f);
ServletOutputStream op = response.getOutputStream();
int count;
while ((count = is.read(arBytes)) > 0)
{
op.write(arBytes, 0, count);
}
op.flush();
op.close();
is.close();
fos.close();
inputStream.close();
File toBeDel = new File("generatedApps/");
GenerateGeddyJsCode.removeDirectory(toBeDel);
File output = new File("output.txt");
output.delete();
removeDirectory
方法如下:
public static void removeDirectory(File dir) {
if (dir.isDirectory()) {
File[] files = dir.listFiles();
if (files != null && files.length > 0) {
for (File aFile : files) {
removeDirectory(aFile);
}
}
} else {
dir.delete();
}
}
问题是,最后只有ZIP存档被删除(顺便说一句,存档是在generatedApps
)。我试图关闭所有流,因为我读到未关闭的流会阻止删除。
如何删除剩余的文件和文件夹?
==================================== 编辑 ========================================
我更新的删除方法:
public static void removeDirectory(File dir) {
if (dir.isDirectory()) {
File[] files = dir.listFiles();
if (files != null && files.length > 0) {
for (File aFile : files) {
removeDirectory(aFile);
}
} else if (files.length == 0) {
dir.delete();
}
}
dir.delete();
}
仍然不能工作。
==================================== 编辑2 ========================================补充:
InputStream inStream = getServletContext().getResourceAsStream("lib/GenerateGeddyJsCode.xsl");
StreamSource inStreamSource = new StreamSource(inStream);
Transformer transformer = tFactory.newTransformer(inStreamSource);
和后来的inStream.close()
。
您可以检查Zip实用程序是否正确关闭文件…您可以访问ZipUsingJavaUtil类源代码吗?
- zip文件中的每个条目都必须关闭。
- 为zip写入过程打开的每个文件输入流应该是关闭。
检查下面的示例:http://www.journaldev.com/957/java-zip-example-to-zip-single-file-and-a-directory-recursively
你永远不会在removeDirectory方法中删除目录。
您需要删除else以使其无条件执行(对于目录和非目录)。
public static void removeDirectory(File dir) {
if (dir.isDirectory()) {
File[] files = dir.listFiles();
if (files != null && files.length > 0) {
for (File aFile : files) {
removeDirectory(aFile);
}
}
}// else {
dir.delete();
// }
}
我想在评论中发表这篇文章,但我没有足够的声誉。我尝试了删除文件的方法,它是可以的,但是如果你可以删除"output.txt"文件应该是因为有一个对象使用该文件,似乎你关闭了所有的流,但检查代码,我看到你使用扫描仪对象来获取appName也许这可能是问题,因为扫描仪对象指向你的"output.txt"文件。
改变:
String appName = new Scanner(new File("output.txt")).useDelimiter("\Z").next();
:
Scanner scanObject = new Scanner(new File("output.txt"));
String appName = scanObject.useDelimiter("\Z").next();
scanObject.close();
我不确定新的扫描器(新的文件("output.txt"));我认为scanObject.close()也应该关闭你传递给扫描仪对象的File对象,如果没有,也试着分开,并在使用扫描仪后关闭File对象。
1)重新格式化代码…什么也看不见
2)在finally块中关闭流
<>之前尝试{...} catch(异常e) {... 处理异常} finally {关闭你必须关闭的!}之前3)"我试图关闭所有流,因为我读到未关闭的流会阻止删除。"我猜你还有打开的文件句柄。即使是外部文件句柄也可以阻止删除。有没有防病毒程序扫描这些文件?在互联网上搜索工具来检测打开的文件句柄。
4)你也可以测试如果aFile.deleteOnExit()工作。"deleteOnExit"尝试在JVM关闭时删除文件。
好运如果你在linux上,你可以用一些命令行版本来删除文件。
Runtime.getRuntime().exec("rm -rf");
'r'标志表示递归,意味着只从基目录开始,该命令删除目录和所有子目录。
'f'标志强制它,不会问你"你想删除xxxx.txt吗?"对于每个文件。
你也可以这样写
Runtime.getRuntime().exec("rm -rf *.java");
如果您只删除Java文件。此外,windows和mac有一个shell删除文件/删除目录命令。希望对大家有所帮助