Неясная ситуация с ext4 / fsync в Android (Java)

Статья Тима Брея «Безопасное сохранение данных» оставила у меня открытые вопросы. Сегодня ему больше месяца, и я не видел никаких дальнейших действий по этому поводу, поэтому я решил обратиться к этой теме здесь.

Один из пунктов статьи заключается в том, что FileDescriptor.sync () должен быть вызван для включения безопасная сторона при использовании FileOutputStream. Сначала я был очень раздражен, потому что за те 12 лет, что я занимаюсь Java, я ни разу не видел, чтобы код Java выполнял синхронизацию. Тем более, что работа с файлами - довольно простая вещь. Также, стандартный JavaDoc FileOutputStream никогда не намекал на синхронизацию (Java 1.0–6). После некоторых исследований я решил, что ext4 может быть первой файловой системой, требующей синхронизации. (Существуют ли другие файловые системы, в которых рекомендуется явная синхронизация?)

Я ценю некоторые общие мысли по этому поводу, но у меня также есть некоторые конкретные вопросы:

  1. Когда Android выполнит синхронизацию с файловой системой? Это может быть периодическим и дополнительно основываться на событиях жизненного цикла (например, процесс приложения переходит в фоновый режим).
  2. Обеспечивает ли FileDescriptor.sync () синхронизацию метаданных? Это синхронизация каталога измененного файла. Сравните с FileChannel.force ().
  3. Обычно запись напрямую в FileOutputStream не выполняется. Вот мое решение (вы согласны?): Я подумал, что ext4 на самом деле может быть первой основной файловой системой, требующей синхронизации. (Существуют ли другие файловые системы, в которых рекомендуется явная синхронизация?)

    Я ценю некоторые общие мысли по этому поводу, но у меня также есть некоторые конкретные вопросы:

    1. Когда Android выполнит синхронизацию с файловой системой? Это может быть периодическим и дополнительно основываться на событиях жизненного цикла (например, процесс приложения переходит в фоновый режим).
    2. Обеспечивает ли FileDescriptor.sync () синхронизацию метаданных? Это синхронизация каталога измененного файла. Сравните с FileChannel.force ().
    3. Обычно запись напрямую в FileOutputStream не выполняется. Вот мое решение (вы согласны?): Я подумал, что ext4 может быть первой файловой системой, требующей синхронизации. (Существуют ли другие файловые системы, в которых рекомендуется явная синхронизация?)

      Я ценю некоторые общие мысли по этому поводу, но у меня также есть некоторые конкретные вопросы:

      1. Когда Android выполнит синхронизацию с файловой системой? Это может быть периодическим и дополнительно основываться на событиях жизненного цикла (например, процесс приложения переходит в фоновый режим).
      2. Обеспечивает ли FileDescriptor.sync () синхронизацию метаданных? Это синхронизация каталога измененного файла. Сравните с FileChannel.force ().
      3. Обычно запись напрямую в FileOutputStream не выполняется. Вот мое решение (вы согласны?): (Существуют ли другие файловые системы, в которых рекомендуется явная синхронизация?)

        Я ценю некоторые общие мысли по этому поводу, но у меня также есть некоторые конкретные вопросы:

        1. Когда Android выполнит синхронизацию с файловой системой? Это может быть периодическим и дополнительно основываться на событиях жизненного цикла (например, процесс приложения переходит в фоновый режим).
        2. Обеспечивает ли FileDescriptor.sync () синхронизацию метаданных? Это синхронизация каталога измененного файла. Сравните с FileChannel.force ().
        3. Обычно запись напрямую в FileOutputStream не выполняется. Вот мое решение (вы согласны?): (Существуют ли другие файловые системы, в которых рекомендуется явная синхронизация?)

          Я ценю некоторые общие мысли по этому поводу, но у меня также есть некоторые конкретные вопросы:

          1. Когда Android выполнит синхронизацию с файловой системой? Это может быть периодическим и дополнительно основываться на событиях жизненного цикла (например, процесс приложения переходит в фоновый режим).
          2. Обеспечивает ли FileDescriptor.sync () синхронизацию метаданных? Это синхронизация каталога измененного файла. Сравните с FileChannel.force ().
          3. Обычно запись напрямую в FileOutputStream не выполняется. Вот мое решение (вы согласны?): sync () позаботиться о синхронизации метаданных? Это синхронизация каталога измененного файла. Сравните с FileChannel.force ().
          4. Обычно запись напрямую в FileOutputStream не выполняется. Вот мое решение (вы согласны?): sync () позаботиться о синхронизации метаданных? Это синхронизация каталога измененного файла. Сравните с FileChannel.force ().
          5. Обычно запись напрямую в FileOutputStream не выполняется. Вот мое решение (вы согласны?):
             FileOutputStream fileOut = ctx.openFileOutput (файл, Context.MODE_PRIVATE);
            BufferedOutputStream out = новый BufferedOutputStream (fileOut);
            пытаться {
             out.write (что-то);
             out.flush ();
             fileOut.getFD (). sync ();
            } Ну наконец то {
             out.close ();
            }
            

13
задан Markus Junginger 16 January 2011 в 20:18
поделиться