擦除:以下功能会覆盖Android上的内存吗?

时间:2019-01-29 03:06:13

标签: java android

我编写了以下函数,希望有人能启发我这里的内存发生什么情况。

public boolean wipe(){
    RandomAccessFile wiper = null;
    int length;
    File file;
    file = new File(fileDirectory);
    byte[] bytes = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
    length = (int) file.length();
    try {
        wiper = new RandomAccessFile(fileDirectory, "rw");
        wiper.seek(0);
        for (int i = 0; i < length/16; i++) {
            wiper.write(bytes); //~2,7MB/s on my phone (16Bytes per iteration)
        }
    }catch(Exception e) {
        e.printStackTrace();
        return false;
    } finally {
        try {
            if (wiper != null)
                wiper.close();
        }catch(IOException e) {
            e.printStackTrace();
            finish();
        }
    }
    Boolean deleted = file.delete();
    if(!deleted){
        Toast.makeText(this, "Problem deleting file! Delete manually", Toast.LENGTH_LONG).show();
    }
    editListView();
    return true;
}

调用该函数:

if(!wipe())
    Toast.makeText(this, "Problem wiping! Wipe again", Toast.LENGTH_LONG).show();

基本上,我在目录中有一个文件,并且找到了该文件的字节长度。然后,我再次使用RandomAccessFile打开文件,并添加16bytes长度的次数。 我使用以下代码来测试功能的效率:

public boolean wipe(){
    RandomAccessFile wiper = null;
    FileInputStream reader = null;
    int length;
    File file;
    file = new File(fileDirectory);
    byte[] bytes = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
    length = (int) file.length();
    System.out.println(length);
    try {
        wiper = new RandomAccessFile(fileDirectory, "rw");
        wiper.seek(0);
        for (int i = 0; i < length/16; i++) {
            wiper.write(bytes);
        }
        byte nextByte[] = new byte[16];
        reader = new FileInputStream(fileDirectory);
        while(reader.read(nextByte) != -1){
            System.out.print(nextByte[0]);
            System.out.print(nextByte[1]);
            System.out.print(nextByte[2]);
            System.out.print(nextByte[3]);
            System.out.print(nextByte[4]);
            System.out.print(nextByte[5]);
            System.out.print(nextByte[6]);
            System.out.print(nextByte[7]);
            System.out.print(nextByte[8]);
            System.out.print(nextByte[9]);
            System.out.print(nextByte[10]);
            System.out.print(nextByte[11]);
            System.out.print(nextByte[12]);
            System.out.print(nextByte[13]);
            System.out.print(nextByte[14]);
            System.out.print(nextByte[15]);
            System.out.println();
        }
    }catch(Exception e) {
        e.printStackTrace();
        return false;
    } finally {
        try {
            if (wiper != null)
                wiper.close();
            if (reader != null)
                reader.close();
        }catch(IOException e) {
            e.printStackTrace();
            finish();
        }
    }
    return true;
}

此代码不会删除目录中的文件,因此有可能看到文件将保持相同大小(以kB为单位)。擦除后将以16包的形式打印文件中存在的所有字节。使用此测试功能,您可以看到覆盖有效并且文件由0组成。问题仍然是擦除,因为尚不清楚在此过程中是否超过了内存。我很确定这些操作大多数都在RAM中进行,但我认为android系统不会在此过程中擦除持久性存储中的内存。这将花费不必要的操作。如果是这样,则意味着文件的地址保持不变,因此,如果我用相同大小的文件(由0组成)覆盖文件,则会完全“擦除”该文件。 我想知道您对存储系统的看法,以及该功能是否可以擦除(安全擦除数据)。如果要自己测试,请使用目录“ / storage / emulated / 0 / PathToAFile”。

1 个答案:

答案 0 :(得分:0)

如果使用追加打开文件,它不会写入文件末尾吗?我认为您需要使用RandomAccessFile并在写入所有零之前寻求文件的开头。