被FileOutputStream的append参数搞死了……

由于某某原因吧,欣赏了一下FileOutputStream这个类的write方法,有些小发现分析如下:

首先,write方法本身有native修饰,也就是说这个方法是使用其它语言实现的。。。

其二,在FileOutputStream的有构造函数FileOutputStream(File file,boolean append),append指示了在对文件读写时是否追加。于是想测试一下append性能,测试过程如下写500行某字符串,第一次开启append循环500次,第二次关闭append,事先构造一个String[500]数组,循环500次重写。最终测试结果如下:

开启----------不开启(毫秒数)
num1:485  num2: 593
num1:469  num2: 578
num1:453  num2: 563
num1:421  num2: 563
num1:453  num2: 578

于是append用铁的事实证明了这哥们的效率。

在测试中遇到个小事故,写出来证明自己比较白痴。。。

最初的时候是这么干得

for(500次){

   output.write(字符串数组[i].getBytes());

}

然后就发现怎么写也不是500行,n久以后才纳过闷来,output是不会覆盖的(因为流没结束啊!!!),因此会逐渐递增,要正常执行每次都要关闭output.close()。

 

另外小测试一下哈:append关闭后,write方法等于复写,即即使源文件多余当前写入内容也不会在从头写到当前内容结束后把原有内容剩余部分留下。

 

public class MainTest {

    File file1,file2;
    FileOutputStream output;
    int len = 500;
    String buffer = "this is a output file line/n";
    String buffer2 = "this is a output file line/n";
    String[] files = new String[len];
    long start,end;
    int num1=0,num2=0;
   
    public void pp(){
        file1 = new File("c:/10");
        file2 = new File("c:/20");
        for(int i=0; i < len; i++, buffer+= buffer2){
            files[i]=buffer;
        }
    }
   
    public int[] test(){
        if(file1.exists()){
            file1.delete();
        }
        if(file2.exists()){
            file2.delete();
        }
        start = Calendar.getInstance().getTimeInMillis();
        try {
           
            for(int i=0; i < len; i++){
                output = new FileOutputStream(file1,true);
                output.write(buffer2.getBytes());
                output.close();
            }
            end = Calendar.getInstance().getTimeInMillis();
        } catch (Exception e) {
        }
       
        num1 = (int) (end -start);
       
        start = Calendar.getInstance().getTimeInMillis();
        try{
            for(int i=0; i <len; i++){
                output = new FileOutputStream(file2,false);
                output.write(files[i].getBytes());
                output.close();
            }
            end = Calendar.getInstance().getTimeInMillis();
        }catch(Exception e){
            e.printStackTrace();
        }
        num2 = (int) (end -start);
       
        int[] result = {num1,num2};
        return result;
    }
   
    public static void main(String[] args){
        MainTest test = new MainTest();
        test.pp();
        int[][] result = new int[5][2];
        for(int i =0; i <5; i++){
            result[i]=test.test();
        }
        System.out.println("final:::");
        for(int[] st :result){
            System.out.println("num1:"+st[0]+"  num2: "+st[1]);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值