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'
我认为这是因为内存泄漏或内存不足的问题。
你能分享一下你的方法吗? –
目前还没有任何方法。正是我上面所展示的。 – Arthur
您录制数据的速度有多快?你有多少带宽到你的服务器? Base64编码需要多少额外*带宽?如果你的记录速率比你的带宽大,数据将会备份 - 很糟糕。如果可以的话,对数据进行base64编码可能会使情况变得更糟,所以在*服务器*上做这件事情。就读取正在编写的文件而言,Java将会非常糟糕。这很难用低级别的CIO来完成,比如'open()'和'read()'。 Java添加了您无法控制的各种缓冲和缓存。 –