2016-09-16 96 views
0

我正在處理一個記錄視頻的應用程序,並且我需要將已經寫入的數據以videofile的形式發送到base64字符串的服務器,而無需停止記錄過程。有誰知道如何用更少的內存消耗來做到這一點?如何在寫入文件時逐個部分讀取文件?

現在我正在做這樣

private void sendNewVideos(String path) { 
    try { 
     Log.i(TAG, "VIDEO PATH - " + path); 
     FileWriter fileWriter = new FileWriter(new File(pathToFolder + "/temp.txt")); 
     String base64String = new String(); 
     File file = new File(path); 
     Long size = 0L; 
     base64String = Base64.encodeToString(readFile(file, size), Base64.DEFAULT); 

     fileWriter.append(base64String); 
     fileWriter.flush(); 
     boolean flag = true; 
     while (flag) { 
      if (size < file.length()) { 
       base64String = Base64.encodeToString(readFile(file, size), Base64.DEFAULT); 
       fileWriter.append(base64String); 
       fileWriter.flush(); 
       size = file.length(); 
      } 

     } 
     fileWriter.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

private byte[] readFile(File file, Long size) { 
    try { 
     RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r"); 

     randomAccessFile.seek(size); 
     FileChannel fileChannel = randomAccessFile.getChannel(); 
     ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024 * 2); 
     while (fileChannel.read(buffer) > 0) { 
      buffer.flip(); 
      byte[] temp = new byte[buffer.limit()]; 
      for (int i = 0; i < buffer.limit(); i++) { 
       temp[i] = buffer.get(i); 
      } 
      buffer.clear(); 
      return temp; 
     } 
     fileChannel.close(); 
     randomAccessFile.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

寫入文件就是檢查它是如何工作的。但經過一段時間錄製停止。有時LogCat顯示這樣的事情

I/art: Thread[3,tid=23425,WaitingInMainSignalCatcherLoop,Thread*=0x7fe42c410800,peer=0x22c08080,"Signal Catcher"]: reacting to signal 3 
I/art: Wrote stack traces to '/data/anr/traces.txt' 

我認爲這是因爲內存泄漏或內存不足的問題。

+1

你能分享一下你的方法嗎? –

+0

目前還沒有任何方法。正是我上面所展示的。 – Arthur

+0

您錄製數據的速度有多快?你有多少帶寬到你的服務器? Base64編碼需要多少額外*帶寬?如果你的記錄速率比你的帶寬大,數據將會備份 - 很糟糕。如果可以的話,對數據進行base64編碼可能會使情況變得更糟,所以在*服務器*上做這件事情。就讀取正在編寫的文件而言,Java將會非常糟糕。這很難用低級別的CIO來完成,比如'open()'和'read()'。 Java添加了您無法控制的各種緩衝和緩存。 –

回答

0

某種解決方案。

  1. 不要使用Base64編碼用於通過網絡發送視頻編碼(連的Wi-Fi),因爲它增加了數據量的大約10倍,這是不是電池非常好,可以殺死或掛你的進程/服務。
  2. 避免讀取正在寫入的文件,並且會降低IO操作速度。
  3. 如果您仍然需要從這些文件中發送數據使用某種算法旁邊的:
    1. 可以訪問文件(例如與緩衝輸入流);
    2. 將文件的一部分讀入緩衝區;
    3. 做盡可能簡單的工作。例如,使用HTTPUrlConnection在單獨的線程中將緩衝區發送到服務器。你可以找到示例here
    4. 控制使用內存,否則系統試圖殺死你的過程。