Java File 操作在windows和linux的不同

本文探讨了Java中File.renameTo()方法在Windows和Linux系统上的不同行为。在多线程环境中,一个线程进行读写操作,另一个线程尝试根据条件(如文件大小限制)移动文件。在Linux上测试正常,但在Windows上测试失败。作者提醒开发者注意API的平台相关性,避免遇到意想不到的问题。
摘要由CSDN通过智能技术生成

使用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值