使用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.p