Ускорьте работу собственной файловой системы 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();
}
В итоге,
- Переместить операцию в новый поток
- Удалите операцию кодирования и декодирования base64 для строки, которую вы хотите сохранить (это было основной причиной)
Всего наилучшего.