由于某某原因吧,欣赏了一下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]);
}
}
}