背景

我将一个相对较大的文本文件保存在android存储中,并定期添加到该文件中,同时将文件大小限制为任意大小(例如2MB)

希望我在某处缺少函数,或者希望有更好的方法来执行此过程。

当前,当文件a超过该任意大小时,我将创建一个临时文件b,复制文件a的相关部分(或多或少地是文件a的子字符串,从字节xxx开始, xxx是文件a的字节数太大,如果我将下一个数据写入日志)加上当前数据,然后用第二个文件a覆盖文件b

这显然是非常低效的...

我不喜欢的另一种解决方案是保留两个文件,并在两个文件之间切换,在当前文件已满时清除下一个文件,并切换到该文件进行输出。

但是,如果我可以做这样的事情,那将是suuuuuper方便的

File A = new File("output");
A.chip(500);


或许

A.subfile(500,A.length()-500);


TLDR;

是否有Android可用的功能或库可以删除文件的一部分?

最佳答案

您是否已经看过RandomAccessFile?尽管无法删除文件的某些部分,但是您可以在文件中寻找任何位置,甚至可以设置长度。因此,如果您检测到文件过大,只需抓住相关部分并跳转到开头即可。将length设置为0并写入新数据。

编辑:

我写了一个小演示。它显示文件大小是否限制为10个字节。如果将值10到15作为字符串传递并用逗号分隔,则在10,11,12之后,将从头开始写入文件,因此在15之后,它会读取13,14,15

public class MainActivity extends Activity {

  private static final String TAG = MainActivity.class.getSimpleName();
  private static final long MAX = 10;
  private static final String FILE_TXT = "file.txt";

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    for (int i = 10; i <= 15; i++) {
      if (i > 10) {
        writeToFile(",");
      }
      writeToFile(Integer.toString(i));
    }
  }

  private void writeToFile(String text) {
    try {
      File f = new File(getFilesDir(), FILE_TXT);
      RandomAccessFile file = new RandomAccessFile(f, "rw");
      long currentLength = file.length();
      if (currentLength + text.length() > MAX) {
        file.setLength(0);
      }
      file.seek(file.length());
      file.write(text.getBytes());
      file.close();
    } catch (IOException e) {
      Log.e(TAG, "writeToFile()", e);
    }
    printFileContents();
  }

  private void printFileContents() {
    StringBuilder sb = new StringBuilder();
    try {
      FileInputStream fin = openFileInput(FILE_TXT);
      int ch;
      while ((ch = fin.read()) != -1) {
        sb.append((char) ch);
      }
      fin.close();
    } catch (IOException e) {
      Log.e(TAG, "printFileContents()", e);
    }
    Log.d(TAG, "current content: " + sb.toString());
  }
}

10-07 19:22
查看更多