Записать текстовый файл (11Mo) в строку base64 (UTF8) (часть JSON), избегая запоминания?
Я хочу делать:
Текстовый файл (журналы) -> Строка в JSON -> загрузить на сервер. У меня даже есть шанс на файл 11Mo?
Мой код:
ArrayList<String> listInfoLog= new ArrayList<String>();
listInfoLog = Tools.readFile(strPathFile); // load my logs from the file as ArrayList
StringBuilder sb = new StringBuilder();
for (int i = 0; i < listInfoLog.size(); i++){
sb.append(listInfoLog.get(i) + "\n");
}
// code en base64
byte[] byteContenu = sb.toString().getBytes("UTF-8"); // OUTOFMEMORY
String byteContenuEncoded64 = Base64.encodeToString(byteContenu, Base64.DEFAULT);
synchroFile.setContenu(byteContenuEncoded64);
JSONObject jsonFile = synchroFile.convertFileToJson();
Вызов getBytes("UTF8") генерирует исключение вне памяти.
12-11 13:49:42.780: E/dalvikvm-heap(13868): Out of memory on a 23040392-byte allocation.
12-11 13:49:42.780: I/dalvikvm(13868): "AsyncTask #3" prio=5 tid=15 RUNNABLE
12-11 13:49:42.780: I/dalvikvm(13868): | group="main" sCount=0 dsCount=0 obj=0x62e4bc60 self=0xab360220
12-11 13:49:42.780: I/dalvikvm(13868): | sysTid=13957 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=-1422168792
12-11 13:49:42.780: I/dalvikvm(13868): | state=R schedstat=( 6042297526 1923573007 5457 ) utm=578 stm=26 core=1
12-11 13:49:42.780: I/dalvikvm(13868): at java.nio.charset.Charsets.toUtf8Bytes(Native Method)
12-11 13:49:42.780: I/dalvikvm(13868): at java.lang.String.getBytes(String.java:856)
12-11 13:49:42.780: I/dalvikvm(13868): at java.lang.String.getBytes(String.java:840)
12-11 13:49:42.780: I/dalvikvm(13868): at com.ier.tepv.base.SynchroReceiptAsync.sendLogs(SynchroReceiptAsync.java:951)
12-11 13:49:42.780: I/dalvikvm(13868): at com.ier.tepv.base.SynchroReceiptAsync.doInBackground(SynchroReceiptAsync.java:600)
12-11 13:49:42.780: I/dalvikvm(13868): at com.ier.tepv.base.SynchroReceiptAsync.doInBackground(SynchroReceiptAsync.java:1)
12-11 13:49:42.780: I/dalvikvm(13868): at android.os.AsyncTask$2.call(AsyncTask.java:288)
12-11 13:49:42.780: I/dalvikvm(13868): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
12-11 13:49:42.780: I/dalvikvm(13868): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
12-11 13:49:42.780: I/dalvikvm(13868): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
12-11 13:49:42.780: I/dalvikvm(13868): at java.lang.Thread.run(Thread.java:841)
12-11 13:49:42.780: W/dalvikvm(13868): threadid=15: thread exiting with uncaught exception (group=0x61817bc0)
12-11 13:49:42.780: E/AndroidRuntime(13868): FATAL EXCEPTION: AsyncTask #3
12-11 13:49:42.780: E/AndroidRuntime(13868): Process: com.ier.tepv.base, PID: 13868
12-11 13:49:42.780: E/AndroidRuntime(13868): java.lang.RuntimeException: An error occured while executing doInBackground()
12-11 13:49:42.780: E/AndroidRuntime(13868): at android.os.AsyncTask$3.done(AsyncTask.java:300)
12-11 13:49:42.780: E/AndroidRuntime(13868): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
12-11 13:49:42.780: E/AndroidRuntime(13868): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
12-11 13:49:42.780: E/AndroidRuntime(13868): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
12-11 13:49:42.780: E/AndroidRuntime(13868): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
12-11 13:49:42.780: E/AndroidRuntime(13868): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
12-11 13:49:42.780: E/AndroidRuntime(13868): at java.lang.Thread.run(Thread.java:841)
12-11 13:49:42.780: E/AndroidRuntime(13868): Caused by: java.lang.OutOfMemoryError
12-11 13:49:42.780: E/AndroidRuntime(13868): at java.nio.charset.Charsets.toUtf8Bytes(Native Method)
12-11 13:49:42.780: E/AndroidRuntime(13868): at java.lang.String.getBytes(String.java:856)
12-11 13:49:42.780: E/AndroidRuntime(13868): at java.lang.String.getBytes(String.java:840)
12-11 13:49:42.780: E/AndroidRuntime(13868): at com.ier.tepv.base.SynchroReceiptAsync.sendLogs(SynchroReceiptAsync.java:951)
12-11 13:49:42.780: E/AndroidRuntime(13868): at com.ier.tepv.base.SynchroReceiptAsync.doInBackground(SynchroReceiptAsync.java:600)
12-11 13:49:42.780: E/AndroidRuntime(13868): at com.ier.tepv.base.SynchroReceiptAsync.doInBackground(SynchroReceiptAsync.java:1)
12-11 13:49:42.780: E/AndroidRuntime(13868): at android.os.AsyncTask$2.call(AsyncTask.java:288)
12-11 13:49:42.780: E/AndroidRuntime(13868): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
12-11 13:49:42.780: E/AndroidRuntime(13868): ... 3 more
Я не понимаю, как я должен действовать? Он работает хорошо, за исключением небольших файлов (150ko), но падает на этот в 11Mo.
Практически, я никогда не встречал этот гигантский файл журнала, так как система запускается, но ради этого, как я могу это сделать?
Я старался:
- разделить цикл по частям, но тоже не запоминается
потоковая передача с байтами, но я не знаю, как установить его в UTF8.
FileInputStream fis = new FileInputStream (fileLog); ByteArrayOutputStream bos = new ByteArrayOutputStream (); byte [] buf = новый байт [1024]; try { for (int readNum; (readNum = fis.read(buf))!= -1;) { bos.write(buf, 0, readNum); // без сомнения здесь 0 } } catch (IOException ex) { new TePVException(tagLocal, "sendLog", "Streaming Log File ex = "+ex.getLocalizedMessage()); } byte[] bytes = bos.toByteArray(); byteContenuEncoded64 = Base64.encodeToString(bytes, Base64.DEFAULT);
Это работает, что является хорошим шагом вперед, но тогда это запомнится здесь: String str = json.toString();
и я вернулся на круги своя:(