- 浏览: 366742 次
文章分类
最新评论
-
strchi:
这个网站,什么都没有了
做小说搜索网站,这个是不是有可能会侵权的呢? -
从此醉:
楼主倒是给出解决办法啊
Java虚拟机支持的最大内存限制 -
kjmmlzq19851226:
又要增强客户体验,又要降低伪造攻击的概率,╮(╯▽╰)╭,程序 ...
Web安全测试之跨站请求伪造(CSRF)篇(图) -
zhangxinze:
linux下使用Java获取客户端ip地址?大家有何高见,我现 ...
怎样用Java来获取真实的IP地址 -
k_kid9157:
学习 感谢分享:-)
log4j的ConversionPattern参数的格式含义
以前我一直以为File#renameTo(File)方法与OS下面的 move/mv 命令是相同的,可以达到改名、移动文件的目的。不过后来经常发现问题,真的很bt,File#renameTo(File)方法会返回失败(false),文件没有移动,又查不出原因,再后来干脆弃用该方法,自己实现一个copy方法,问题倒是再也没有出现过。
昨天老板同学又遇到这个问题,File#renameTo(File)方法在windows下面工作的好好的,在linux下偶尔又失灵了。回到家我扫了一遍JDK中File#renameTo(File)方法的源代码,发现它调用的是一个本地的方法(native method),无法再跟踪下去。网上有人说该方法在window下是正常的,在linux下面是不正常的。这个很难说通,SUN不可能搞出这种平台不一致的代码出来啊。
后面在SUN的官方论坛上看到有人提到这个问题“works on windows, don't work on linux”,后面有人回复说是“file systems”不一样。究竟怎么不一样呢?还是没有想出来...
后面在一个论坛里面发现了某人关于这个问题的阐述:
In the Unix'esque O/S's you cannot renameTo() across file systems. This behavior is different than the Unix "mv" command. When crossing file systems mv does a copy and delete which is what you'll have to do if this is the case.
The same thing would happen on Windows if you tried to renameTo a different drive, i.e. C: -> D:
终于明白咯。
做个实验:
File sourceFile = new File("c:/test.txt"); File targetFile1 = new File("e:/test.txt"); File targetFile2 = new File("d:/test.txt"); System.out.println("source file is exist? " + sourceFile.exists() + ", source file => " + sourceFile); System.out.println(targetFile1 + " is exist? " + targetFile1.exists()); System.out.println("rename to " + targetFile1 + " => " + sourceFile.renameTo(targetFile1)); System.out.println("source file is exist? " + sourceFile.exists() + ", source file => " + sourceFile); System.out.println(targetFile2 + " is exist? " + targetFile2.exists()); System.out.println("rename to " + targetFile2 + " => " + sourceFile.renameTo(targetFile2));
注意看结果,从C盘到E盘失败了,从C盘到D盘成功了。因为我的电脑C、D两个盘是NTFS格式的,而E盘是FAT32格式的。所以从C到E就是上面文章所说的"file systems"不一样。从C到D由于同是NTFS分区,所以不存在这个问题,当然就成功了。
果然是不能把File#renameTo(File)当作move方法使用。
可以考虑使用apache组织的commons-io包里面的FileUtils#copyFile(File,File)和FileUtils#copyFileToDirectory(File,File)方法实现copy的效果。至于删除嘛,我想如果要求不是那么精确,可以调用File#deleteOnExit()方法,在虚拟机终止的时候,删除掉这个目录或文件。
BTW:File是文件和目录路径名的抽象表示形式,所以有可能是目录,千万小心。
下面我写的一个实现方法
/**
* 使用FileChannel拷贝文件
*
* @param srcFile
* @param destFile
* @throws IOException
*/
public static void copyUseChannel(File srcFile, File destFile)
throws IOException {
if ((!srcFile.exists()) || (srcFile.isDirectory())) {
return;
}
if (!destFile.exists()) {
createFile(destFile.getAbsolutePath());
}
FileChannel out = null;
FileChannel in = null;
try {
out = new FileOutputStream(destFile).getChannel();
in = new FileInputStream(srcFile).getChannel();
ByteBuffer buffer = ByteBuffer.allocate(102400);
int position = 0;
int length = 0;
while (true) {
length = in.read(buffer, position);
if (length <= 0) {
break;
}
// System.out.println("after read:"+buffer);
buffer.flip();
// System.out.println("after flip:"+buffer);
out.write(buffer, position);
position += length;
buffer.clear();
// System.out.println("after clear:"+buffer);
}
} finally {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
}
}
发表评论
-
推荐JS压缩工具ESC
2009-01-08 20:13 2114昨天将CheckBox转Text的代码从HTML中剥离出来之 ... -
怎样用Java来获取真实的IP地址
2009-01-06 13:05 7439在JSP里,获取客户端的IP地址的方法是:request.ge ... -
CLOSE_WAIT状态的生成原因[转]
2008-12-16 14:50 3036CLOSE_WAIT状态的生成原因首先我们知道,如果我们的Cl ... -
tcp相关状态
2008-12-16 14:42 1274客户端口实际上就是从本机访问其它计算机服务时打开的源端 ... -
网站前端优化一些小经验
2008-12-04 20:32 918着第3届bt论坛的顺利结 ... -
Base64基础(2)
2008-12-02 10:19 1295url: http://zh.wikipedia.org/wi ... -
什么是Base64以及sun.misc.BASE64Decoder的用法
2008-11-24 15:10 4808Base64是网络上最常见的用于传输8Bit字节代码的编码方式 ... -
Regex的一些常用例子
2008-11-11 12:37 1302import java.util.HashMap; imp ... -
值得收藏的健康知识
2008-11-03 11:53 1525不要死于无知。 不要拿 ... -
垂直搜索的信息分类如何做
2008-10-24 10:09 1453垂直搜索的优势就在 ... -
Twitter的增容处理
2008-10-21 12:00 966文/Patrick Joyce译/杨昊 由于之前 ... -
一步步图解 Tomcat 体系结构
2008-10-08 10:42 2251Apache Tomcat 是一款非常著名的开源 Servle ... -
Java编码原理与解决方案
2008-10-07 22:40 1278一、Java编码是怎么回事? 对于使用中文以及其他非拉丁语系语 ... -
JAVA分布式应用中使用XML数据
2008-09-24 15:14 1266可扩展标记语言(XML) ... -
红黑树(red-black tree)算法,附AVL树的比较
2008-09-03 15:01 14099红黑树的定义 正如在CLR ... -
状态对象:数据库的替代者
2008-09-03 10:39 881这是一个实战中非常重 ... -
一个计算机专业学生几年的编程经验汇总
2008-08-02 21:04 1385想来学习Java也有两个年头了,永远不敢说多么精通,但也想谈谈 ... -
UUID的介绍与使用
2008-07-30 17:24 2858一.UUID的介绍:UUID又称为通用唯一标识符,是一个128 ... -
htmlparser使用指南
2008-07-05 14:07 2990需要做一个垂直搜索引擎,比较了nekohtml和htmlp ... -
Apache安装配置与优化
2008-07-04 15:06 1623文针对apache web服务器的安装配置收集有效的一些经验 ...
相关推荐
java的file rename方法 以前我一直以为File#renameTo(File)方法与OS下面的 move/mv 命令是相同的,可以达到改名、移动文件的目的。不过后来经常发现问题:File#renameTo(File)方法会返回失败(false),文件没有移动,...
Better File Rename 5.7 绿色汉化版 Better File Rename 是一款强大易用的文件批量改名软件。内置最全面的重命名选项。 现已支持64位操作系统。 5.7 英文原版更新说明: ① 添加了 PDF 格式的用户手册 ② 在所有...
Better File Rename 好用的文件重命名工具
Better File Rename文件重命名工具,功能强大,各种重命名。 适合文件处理各种使用。
Better File Rename 是一款WINDOWS 资源管理器的扩展外壳,可以帮助你快速简便的修改文件名和文件修改时间,可以分别处理文件名和扩展名。
java临时⽂件重命名_Java程序重命名⽂件或⽬录 ⽅法java.io.File.renameTo()⽤于重命名⽂件或⽬录。此⽅法需要⼀个参数,即⽂件或⽬录被重命名的名称,重命名成功后返回true,否则 返回false。 演⽰此的程序如下所⽰...
Quick File Rename 批量修改文件后缀,功能简单,但很实用。个人认为比那些体积庞大的工具要好用的多。
是一款WINDOWS资源管理器的扩展外壳,可以帮助你快速简便的修改文件名和文件修改时间,可以分别处理文件名和扩展名。 一款WINDOWS资源管理器的扩展外壳, 可以帮助你快速简便地修改文件名和文件修改时间。...
XML file to rename bulk of files
本例中修改文件名使用Delphi中自带函数RenameFile来实现,具体用法可参考下述代码: Try RenameFile(Edit1.Text,Edit2.Text); SHowMessage('更改成功'); except ShowMessage('更改失败'); end;
该程序可以成批次的更改文件名称,代码值得学习研究,编译后,即可执行
python笔记源码,凑字数:请支持我请支持我请支持我请支持我
GitHub365计划 此举主要目的是为了复习以前的知识,并对自己的自律进行...RenameMess.java 测试 renameTo 重命名方法 ####2015-1-26 BulbbleSort.java 冒泡排序 ####2015-1-27 duotaiarray-* 多态数组的demo ####2015-
本不该要分 但我下载缺分 没办法,大家多支持逸云科技!谢谢 一款WINDOWS资源管理器的扩展外壳, 可以帮助你快速简便地修改文件名和文件修改时间。功能有:强大的命名方式,文字、日期和序列数字的添加、去除、插入和...
这是一个打开文件实例,讲述了几个文件函数以及字符串函数的用法,有点乱
基于上一个版本修正: 1、正则修正忽略大小写,支持E/EP/Ep/e/ep/eP等 2、支持百集以上电视剧,并自动在单数补0,如100集电视剧,第一集表示为001
批量重命名 綠色 file rename
File Reamer is a small program to allow you to rename multiple files. You may need this program if you need to rename lots of pictures e.g. from a camera
log4j:ERROR Failed to rename错误解决办法 http://www.blogjava.net/DreamAngel/archive/2011/11/10/363400.html