对文件写0操作时的陷阱

之前在实际开发过程中,需要对文件做写0操作,防止文件被恢复。在向文件写0的过程中一个要素就是需要获取写0之前的文件的长度。

大概思路如下:

 

File file = new File("H:\\tmp\\test.txt");
         
FileOutputStream oStream = new FileOutputStream(file);
for(int i = 0; i < file.length(); i++){
    oStream.write(0);
}


 

这里其实犯了一个错误,此时获取到的file.lenght0

实测代码如下:

public void test() throws FileNotFoundException {
        File file = new File("H:\\tmp\\test.txt");
        System.out.println(file.length());
         
        FileOutputStream oStream = new FileOutputStream(file);
        System.out.println(file.length());
}


 

打印结果如下:

10
0


 

出现该问题的原因是在使用FileOutpuStream的时候创建了一个新的文件对象,原来的数据被清空了。可以从如下代码进一步验证:

public void test2() throws FileNotFoundException {
        File file = new File("H:\\tmp\\test.txt");
        System.out.println(file.length());
         
        FileOutputStream oStream = new FileOutputStream(file,true);
        System.out.println(file.length());
}


 

打印结果如下:

10
10


 

在使用FileOutputStream(Filefile, boolean append) 方法实例化文件输出流的时候采用的是追加方式,所以此时能正常的获取到文件的长度。

 

因此正确思路应该如下:

public void test3() throws IOException {
        File file = new File("H:\\tmp\\test.txt");
 
        long fileLength = file.length();
        try (FileOutputStream oStream = new FileOutputStream(file)) {
            System.out.println(fileLength);
            for (int i = 0; i < fileLength; i++) {
                oStream.write(0);
            }
        } catch (Exception e) {
            System.out.println(e);
        }
}
 


这种写法还可以减少循环计算file.length的次数。如果编译器有优化则要另说了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值