说明
最近处理一个项目bug的时候,针对文件处理的bug很多,这里总结一下。
文件删除
Java对文件删除存在两种方式:
File file = new File(path);
file.delete();
file.deleteOnExit();
对于第一种,file.delete() 删除是即时生效的。后来,我们在代码中使用这个代码块(仅针对文件)
while (file.exists()) {
file.delete();
}
对于第二种,file.deleteOnExit();文件不会立即删除。只有在程序运行结束的时候,才会检查文件是否存在,如果存在则删除,否则不做任何操作。
就我们自己的系统而言,需要来在一个固定的目录(对存储空间有要求)下生成一个文件,然后将这个文件的数据copy到另一个文件中。因此,需要不断的删除已经存在的旧文件,并新建新的文件——有点类似于日志的记录。因此,我们只能采用第一种方式来删除文件。
对于另一个项目,他们只需要在系统退出的时候清理掉所有生成的中间文件,因此,他们一般使用第二种方式。在文件读取处理结束后加一句deleteOnExit(),这样的前提是不需要考虑存储空间的大小——文件很少,也很小,但是分布的路径是随机的。好处就是在系统正常退出的时候不需要去判断有哪些文件需要删除,也不需要去检查文件是否真的存在。
针对多层文件夹的删除
public void delete(String path) {
File file = new File(path);
if (!file.exists()) {
return;
}
if (file.isFile()) {
//删除单个文件
file.delete();
} else {
String[] childList = file.list();
//循环删除子文件夹下的文件
for (String childPath : childList) {
String child = path + "\\" + childPath;
delete(child);
}
//删除空文件夹
file.delete();
}
}
文件创建
目前没有遇到坑,主要的代码问题还是因为删除的方式有问题导致的
代码片如下:
File file = new File(path);
while (file.exists()) {
file.delete();
}
while (!file.exists()) {
file.createNewFile();
}
file.setWritable(true);
file.setReadable(true);
文件处理
这一块主要做的是多文件数据比对工作,最后要将文件比对结果写入一个Excel表格中。主要的问题就是数据量太大的时候会导致CPU 100%和内存不够。初步采取的方案是分批次写入多个文件,对每个文件的大小作限制(后续补充)。