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

一、问题描述

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

File file = new File(fileName);
File newFile = new File(fileName.replace("2008", "2011"));

BufferedReader bReader = new BufferedReader(new FileReader(file));
PrintWriter pWriter = new PrintWriter(newFile.getPath());
String linesString = "";
if (!file.exists()) {
	throw new RuntimeException("文件不存在");
}else{
	while((linesString = bReader.readLine())!=null){
	System.out.println(linesString.replace("2008-", "2009-"));
	}
	bReader.close();
	pWriter.close();
}
if(file.renameTo(newFile)){
	System.out.println("Rename file succeed");
}else {
	System.out.println("Rename file failed");
}

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

二、解决方案

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

我的解决方案是这样的:

第一步:

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

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

第二步:

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

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

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

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

    File target = new File(newFilename);
    if (target.exists()) { //新文件若存在,则删掉
      target.delete();
    }
    File file = new File(fileName); // 旧文件
    boolean result = file.renameTo(target); //将旧文件更名
    if(result) {
      LogLog.debug(fileName +" -> "+ newFilename);
    } else { //更名失败,则采取变相的更名方法
        try{
            FileUtils.cloneFile(file, target); // 将旧文件拷贝给新文件
            LogLog.debug(fileName +" -> "+ newFilename);
            //清空旧文件
            emptyFileContent(file);
        } catch (IOException e) {
            LogLog.error("Failed to rename ["+fileName+"] to ["+newFilename+"].");
        }
    }

    /** 清空文件内容 */
    public static void emptyFileContent(File file) {
        FileOutputStream out = null;
        try {
            out = new FileOutputStream(file);
            out.write(new byte[0]);
        } catch (Exception e) {
            LogLog.error("Can't not empty " + file.getName());
        } finally {
            IOUtils.close(out);
        }
    }

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

时间: 2024-08-05 16:13:23

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

Java 文件重命名

Java 文件重命名 /** * 重命名文件 * @param fileName * @return */ public static void renameFile(String filePath, String fileName) { SimpleDateFormat fmdate = new SimpleDateFormat("yyyyMMddHHmmssSSS"); String oldFileName = filePath+"/"+fileName; Fi

java 获取文件名(不包括文件的后缀)和文件重命名

获取文件名(不包括后缀) originalFileName.substring(0, originalFileName.lastIndexOf(".")) 文件重命名 public void renameFile(String file, String toFile) { File toBeRenamed = new File(file); //检查要重命名的文件是否存在,是否是文件 if (!toBeRenamed.exists() || toBeRenamed.isDirector

Java用来进行批量文件重命名,批量提取特定类型文件

原因: 因为在网上下载视频教程,有的名字特别长,一般都是机构或者网站的宣传,不方便直接看到视频的简介,所以做了下面的第一个功能. 因为老师发的课件中,文件夹太多,想把docx都放在同一个文件夹下面,一个一个找出来太麻烦,所以做了第二个功能.       最近刚刚学了Java文件和流的知识,所以正好练练手,这也是自己的第一个exe程序,分享一下哈. (导出jar文件,以及用工具exe4j生成exe文件,这部分省略了哈) 用到的知识: 用到Java中文件,流的知识,以及简单的GUI知识. 功能:  

oc NSFileManager 文件夹创建、文件移动、文件复制、文件重命名

// 初始化管理类 NSFileManager * manager = [NSFileManager defaultManager]; // 路径 NSString * DirectoryPath = [NSHomeDirectory() stringByAppendingPathComponent:@"/desktop/我的文件夹1/我的文件夹2"]; NSError * error = nil; if ([manager createDirectoryAtPath:Director

Linux rename命令文件重命名的用法汇总

Linux命令中的rename命令主要用于给文件重命名,与mv命令有些类似,但rename可以对批量文件进行重命名,而mv命令则只能对单个文件重命名,下面就给大家详细介绍下Linux rename命令的使用方法吧. Linux的 rename 命令有两个版本,一个是C语言版本的,一个是Perl语言版本的,早期的Linux发行版基本上使用的是C语言版本的,现在已经很难见到C语言版本的了,由于历史原因,在Perl语言大红大紫的时候,Linux的工具开发者们信仰Perl能取代C,所以大部分工具原来是C

Ubuntu Linux 批量修改图片大小以及文件重命名

0x00 本文属于随笔, 仅供作者学习记录. 0x01 批量修改图片大小: [email protected]:~/$ find ./ -name '*.jpg' -exec convert -resize 220X520! {} {} \; 备注: 上述命令中, find 路径 -name 匹配.jpg后缀的文件 -exec 对find结果执行convert命令 后面是convert参数, 如果没有安装convert, sudo apt-get install convert安装即可. -re

如何使用ffmpeg的sdk实现对文件删除和文件重命名

文件的删除与重命名 // 文件的删除 avpriv_io_delete(); // 文件的重命名 avpriv_io_move(); 举例操作 vim ffmpeg_file.c // FFmpeg文件操作的头文件 #include <libavformat/avformat.h> int main(int argc, char *argv[]) { int ret; ret = avpriv_io_move("111.txt", "222.txt");

利用datafile copy将数据文件重命名

思路: o 利用RMAN对数据文件做copy o 将数据文件offline o switch文件名,这一步将更改控制文件中数据文件对应的文件名 o recover数据文件 o 将数据文件online,恢复生产 注:也可以利用这种思路做DATABASE COPY,然后做SWITCH DATABASE,迁移数据库... 实验过程如下: ====================================== SQL> archive log list; Database log mode    

ListView 文件重命名

unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, ComCtrls, StdCtrls; type   TForm1 = class(TForm)     ListView1: TListView; ListView2: TListView; Button1: TButton; Edit1: TEdit; Edit2: