我编写了以下函数,希望有人能启发我这里的内存发生什么情况。
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”。
答案 0 :(得分:0)
如果使用追加打开文件,它不会写入文件末尾吗?我认为您需要使用RandomAccessFile并在写入所有零之前寻求文件的开头。