使用java API一定要注意javadoc里面关于API的描述,不是所有的API behaviour都在任意平台一致的
系统中使用了java file的rename方法,相关的测试用例一直在linux平台工作的很好,可是当我把代码checkout到windows的时候发现测试失败了,仔细研究了代码,发现系统有多线程使用同一个文件,一个线程是通过系统的java 类往文件做读写操作,另外一个线程在达到某种条件的时候()比如文件大小限制)调用rename方法移动文件。我第一感觉认为这种代码不可能不出错,rename的时候会丢失数据,可是实际linux的测试结果一切都好,只有我在windows的测试才出了问题。我自己简化创建了以下的代码来测试rename在windows和linux的不同,同时也在javadoc看到了相关的描述,这个函数是平台相关的实现。
在开发的时候一定要注意api是否是平台相关的,否则会发现很多稀奇古怪的问题。
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
File file = new File("temp");
try {
file.createNewFile();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
RandomAccessFile raf = new RandomAccessFile(file,"rw");
while(true){
raf.seek(file.length());
raf.write(13);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOExcepti

本文探讨了Java中File.renameTo()方法在Windows和Linux系统上的不同行为。在多线程环境中,一个线程进行读写操作,另一个线程尝试根据条件(如文件大小限制)移动文件。在Linux上测试正常,但在Windows上测试失败。作者提醒开发者注意API的平台相关性,避免遇到意想不到的问题。
最低0.47元/天 解锁文章
537

被折叠的 条评论
为什么被折叠?



