Ускорьте работу собственной файловой системы React (RNFS) на Android

Начать писать У меня было неудовольствие читать и записывать относительно большую строку на диск с помощью RNFS в приложении React Native. На запись в файл ушло около 16 секунд, а на чтение из файла — 20 секунд. Я не получил достаточно ответов в Интернете, поэтому я возился с исходным кодом.

Это сводится к изменению методов в файле

node-modules/react-native-fs/android/source/main/java/com/rnfs/RNFSManager.java

Отсюда…

@ReactMethod
public void readFile(String filepath, Promise promise) {
  try {
    File file = new File(filepath);

    if (file.isDirectory()) {
      rejectFileIsDirectory(promise);
      return;
    }

    if (!file.exists()) {
      rejectFileNotFound(promise, filepath);
      return;
    }

    FileInputStream inputStream = new FileInputStream(filepath);
    byte[] buffer = new byte[(int)file.length()];
    inputStream.read(buffer);

    String base64Content = Base64.encodeToString(buffer, Base64.NO_WRAP);

    promise.resolve(base64Content);
  } catch (Exception ex) {
    ex.printStackTrace();
    reject(promise, filepath, ex);
  }
}

К

@ReactMethod
public void readFile(final String filepath, final Promise promise) {
  new Thread(new Runnable() {
    public void run() {
      try {
        File file = new File(filepath);

        if (file.isDirectory()) {
          rejectFileIsDirectory(promise);
          return;
        }

        if (!file.exists()) {
          rejectFileNotFound(promise, filepath);
          return;
        }

        FileInputStream inputStream = new FileInputStream(filepath);
        byte[] buffer = new byte[(int)file.length()];
        inputStream.read(buffer);
        String str = new String(buffer, "UTF-8");
        promise.resolve(str);
      } catch (Exception ex) {
        ex.printStackTrace();
        reject(promise, filepath, ex);
      }
    }
  }).start();
}

Для записи в файл я изменил

@ReactMethod
public void writeFile(String filepath, String base64Content, Promise promise) {
  try {
        byte[] bytes = Base64.decode(base64Content, Base64.DEFAULT);
        FileOutputStream outputStream = new FileOutputStream(filepath);
        outputStream.write(bytes);
        outputStream.close();
        promise.resolve(null);
      } catch (Exception ex) {
        ex.printStackTrace();
        reject(promise, filepath, ex);
      }
}

К

@ReactMethod
public void writeFile(final String filepath, final String base64Content, final Promise promise) {
  new Thread(new Runnable() {
    public void run() {
      try {
        byte[] bytes = base64Content.getBytes();
        FileOutputStream outputStream = new FileOutputStream(filepath);
        outputStream.write(bytes);
        outputStream.close();

        promise.resolve(null);
      } catch (Exception ex) {
        ex.printStackTrace();
        reject(promise, filepath, ex);
      }
    }
  }).start();
}

В итоге,

  1. Переместить операцию в новый поток
  2. Удалите операцию кодирования и декодирования base64 для строки, которую вы хотите сохранить (это было основной причиной)

Всего наилучшего.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *