Мне нужно сделать простое шифрование, чтобы обычный конечный пользователь не мог легко получить доступ к некоторым файлам.
Файлы, которые считываются 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;
}
Объем памяти огромен, так как в моей памяти есть полный массив байтов (мы говорим о растровых изображениях с> 2 МБ в памяти).
Я подумал, что мог бы просто расширить класс FileInputStream и выполнять манипулирование байтами при чтении содержимого файла. Это уменьшило бы использование памяти, так как я мог бы использовать Bitmap.decodeStream(inputstream)
вместо создания байтового массива для получения растрового изображения ... но здесь я застрял полностью. Методы read()
и readBytes(...)
являются родными, поэтому я не могу их переопределить.
Пожалуйста, распространите свет в моей тьме ...