如何在编写文件时逐个阅读文件?

时间:2016-09-16 07:06:59

标签: java android io

我正在开发一个记录视频的应用程序,我需要在vidofile中将已写入的数据以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 :(得分:0)

某种解决方案。

  1. 不要使用Base64对视频进行编码以便通过网络(甚至是Wi-Fi)进行发送,因为它会增加大约10倍的数据量,这对电池来说不是很好,可能会导致进程/服务中断或挂起。
  2. 尽量避免读取正在写入的文件并降低IO操作速度。
  3. 如果您仍需要从此类文件发送数据,请使用以下某种算法:
    1. 访问文件(例如使用缓冲的输入流);
    2. 读取部分文件到缓冲区;
    3. 尽可能简单地使用它。例如,使用HTTPUrlConnection在单独的线程中将缓冲区发送到服务器。您可以找到示例here
    4. 控制已用内存,否则系统会试图杀死你的进程。