2016-09-16 113 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. 控制使用内存,否则系统试图杀死你的过程。