在读取时修改InputStream读取的字节,而不是更晚

时间:2011-09-27 16:48:44

标签: java android inputstream fileinputstream

我需要进行简单的加密,以便普通最终用户无法轻松访问某些文件。

FileInputStream读取的文件是html文件,pngs,jpegs和不同的简单文本文件(javascript,xml,...)

我目前所做的是:

public static byte[] toEncryptedByteArray(InputStream input) throws IOException {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    copy(input, output, true);
    return output.toByteArray();
}

public synchronized static final int copy(final InputStream input, final OutputStream output, final boolean modify) throws IOException {
    if (input == null || output == null) {
        throw new IOException("One stream is null!");
    }
    byte[] mBuffer = new byte[DEFAULT_BUFFER_SIZE];
    int count = 0;
    int n;
    while ((n = input.read(mBuffer)) != -1) {
        if (modify) {
            for ( int i = 0 ; i < n ; i++ ) {
                mBuffer[i] = (byte) ~mBuffer[i]; // byte manipulation
            }
        }
        output.write(mBuffer, 0, n);
        output.flush();
        count += n;
    }
    mBuffer = null;
    return count;
}

内存占用量很大,因为我的内存中有完整的字节数组(我们在内存中讨论位图> 2mb的位图)。

我以为我可以简单地扩展FileInputStream类,并在读取文件内容时进行字节操作。这会减少内存使用量,因为我可以使用Bitmap.decodeStream(inputstream)而不是创建一个字节数组来获取位图......但是在这里我完全陷入困境。 <{1}}和read()方法是原生的,因此我无法覆盖它们。

请把光传播到我的黑暗中......

2 个答案:

答案 0 :(得分:2)

Streams旨在包装。这就是为什么你经常看到如下行:

InputStream is=new BufferedInputStream(new FileInputStream(file));

所以,创建一个DecryptingInputStream进行解密,包裹另一个InputStream

所有这一切,这都不难破解,因为您的解密密钥和算法很容易被反编译您的应用程序的任何人确定。

答案 1 :(得分:0)

FileInputStream不是你的问题。每次调用时,read()函数的读取次数不会超过DEFAULT_BUFFER_SIZE。这是你使用ByteArrayOutputStream,当你正在写它时会占用大量内存。

如果您想减少所需的内存量,我建议您直接写入FileOutputStream而不是ByteArrayOutputStream。因此,当您从InputStream中读取DEFAULT_BUFFER_SIZE时,请加密并写入磁盘。