最近在做新的项目,发现了一个问题:在java中使用reNameTo函数有时候会失败。找了很长时间的问题,也没有一个确切的答案。
在java底层的api中对此函数的使用有说明——使用时要关心一下操作系统使用的文件系统,于是想想就别用了。
既然是重命名,那就用“先拷贝在删除”的操作来替代renameto函数。代码很简单,如下:
public class FileTools { private static Logger _log = Logger.getLogger(FileTools.class); /** * 文件重命名 * @param oldname * @param newname */ public static void reNameFile(String oldname, String newname){ _log.debug("reNameFile1"); try{ FileUtils.copyFile(new File(oldname), new File(newname)); _log.debug("reNameFile2"); // 删除原文件 new File(oldname).deleteOnExit(); _log.debug("reNameFile3"); }catch(IOException ioex){ _log.error("文件重命名失败:", ioex); } _log.debug("reNameFile4"); } public static void main(String[] args) throws IOException, InterruptedException { InputStream input = new FileInputStream(new File("d:\\wujh.cfg")); _log.debug(input.read()); _log.debug("main1"); reNameFile("d:\\wujh.cfg", "d:\\wujh1.cfg"); _log.debug("main2"); Thread.sleep(50000); _log.debug(input.read()); _log.debug("main3"); input.close(); } }
我觉得如果有文件被打开的时候再去删除文件就会报错,但是我的想法是错误的,执行结果如下
2011-10-17 11:52:27,656-[main][DEBUG]-[FileTools]83 2011-10-17 11:52:27,656-[main][DEBUG]-[FileTools]main1 2011-10-17 11:52:27,656-[main][DEBUG]-[FileTools]reNameFile1 2011-10-17 11:52:27,672-[main][DEBUG]-[FileTools]reNameFile2 2011-10-17 11:52:27,672-[main][DEBUG]-[FileTools]reNameFile3 2011-10-17 11:52:27,672-[main][DEBUG]-[FileTools]reNameFile4 2011-10-17 11:52:27,672-[main][DEBUG]-[FileTools]main2 2011-10-17 11:53:17,686-[main][DEBUG]-[FileTools]68 2011-10-17 11:53:17,686-[main][DEBUG]-[FileTools]main3
从执行结果可以看出reNameFile函数已经执行完成了但是被删除的文件的内容还是能够被读取出来的,最后看了一下文件的变化情况,发现:reNameFile函数虽然执行完成但是文件却没有被删除,直到close后才被删除。