巧妙地解决Java文件重命名失败的问题

拼搏现实的明天。 2022-12-14 08:46 559阅读 0赞

一、问题描述

1、大家在用log4j时,可能会遇到下面的一个报错信息:

Failed to rename [/opt/proj.log] to [/opt/proj.log.2014-03-20].

这个算是log4j.DailyRollingFileAppender的一个BUG,网上很多修改方案,不过我能搜到的,都不理想。

2、一般性问题:文件重命名失败

详细的内容可以参见论坛的帖子:http://bbs.csdn.net/topics/330195396

关键内容如下:

我也遇到了和LZ相同的问题,也是无法重命名,但是可以先重命名,然后再执行其他操作!如果先执行其他的操作,比如读这个文件,然后再修改这个文件名字,就无法重命名了,我先把代码贴出来了,大家帮忙了啊!!

  1. File file = new File(fileName);
  2. File newFile = new File(fileName.replace("2008", "2011"));
  3. BufferedReader bReader = new BufferedReader(new FileReader(file));
  4. PrintWriter pWriter = new PrintWriter(newFile.getPath());
  5. String linesString = "";
  6. if (!file.exists()) {
  7. throw new RuntimeException("文件不存在");
  8. }else{
  9. while((linesString = bReader.readLine())!=null){
  10. System.out.println(linesString.replace("2008-", "2009-"));
  11. }
  12. bReader.close();
  13. pWriter.close();
  14. }
  15. if(file.renameTo(newFile)){
  16. System.out.println("Rename file succeed");
  17. }else {
  18. System.out.println("Rename file failed");
  19. }

你这个只是单纯的为文件重命名,没进行其他的操作,现在的问题是,进行了其他的读写流之类的操作,然后重命名操作失败了!只是单纯的重命名,大家都能成功的!!

二、解决方案

在我写这篇文章之前,还没有真正地有效解决这个问题。

我的解决方案是这样的:

第一步:

先把原文件copy一份,copy的那份就命名为要重命名的文件。

比如proj.log,我拷贝一份,命名成proj.2014-03-20.log

第二步:

本来我的思路是这样的:删除原proj.log,然后再新建一个proj.log

但是我发现,原proj.log文件不但无法重命名,而且无法删除。

所以,我换了种思路:直接打开proj.log的输入流,然后把它的文件内容清空。

总结一下,变相的文件重命名思路:直接上代码,参见注释。

  1. File target = new File(newFilename);
  2. if (target.exists()) { //新文件若存在,则删掉
  3. target.delete();
  4. }
  5. File file = new File(fileName); // 旧文件
  6. boolean result = file.renameTo(target); //将旧文件更名
  7. if(result) {
  8. LogLog.debug(fileName +" -> "+ newFilename);
  9. } else { //更名失败,则采取变相的更名方法
  10. try{
  11. FileUtils.cloneFile(file, target); // 将旧文件拷贝给新文件
  12. LogLog.debug(fileName +" -> "+ newFilename);
  13. //清空旧文件
  14. emptyFileContent(file);
  15. } catch (IOException e) {
  16. LogLog.error("Failed to rename ["+fileName+"] to ["+newFilename+"].");
  17. }
  18. }
  19. /** 清空文件内容 */
  20. public static void emptyFileContent(File file) {
  21. FileOutputStream out = null;
  22. try {
  23. out = new FileOutputStream(file);
  24. out.write(new byte[0]);
  25. } catch (Exception e) {
  26. LogLog.error("Can't not empty " + file.getName());
  27. } finally {
  28. IOUtils.close(out);
  29. }
  30. }

发表评论

表情:
评论列表 (有 0 条评论,559人围观)

还没有评论,来说两句吧...

相关阅读