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添加了您無法控制的各種緩衝和緩存。 –