Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在读取时修改InputStream读取的字节,而不是稍后_Java_Android_Inputstream_Fileinputstream - Fatal编程技术网

Java 在读取时修改InputStream读取的字节,而不是稍后

Java 在读取时修改InputStream读取的字节,而不是稍后,java,android,inputstream,fileinputstream,Java,Android,Inputstream,Fileinputstream,我需要做一个简单的加密,这样普通的终端用户就不能轻易地访问一些文件 FileInputStream读取的文件包括html文件、PNG、JPEG和不同的简单文本文件(javascript、xml等) 我现在做的是: public static byte[] toEncryptedByteArray(InputStream input) throws IOException { ByteArrayOutputStream output = new ByteArrayOutputStream(

我需要做一个简单的加密,这样普通的终端用户就不能轻易地访问一些文件

FileInputStream读取的文件包括html文件、PNG、JPEG和不同的简单文本文件(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;
}
public static byte[]toEncryptedByteArray(InputStream输入)引发IOException{
ByteArrayOutputStream输出=新建ByteArrayOutputStream();
复制(输入、输出、真);
返回output.toByteArray();
}
公共同步静态最终int复制(最终InputStream输入、最终OutputStream输出、最终布尔修改)引发IOException{
如果(输入==null | |输出==null){
抛出新IOException(“一个流为空!”);
}
byte[]mBuffer=新字节[默认缓冲区大小];
整数计数=0;
int n;
而((n=input.read(mBuffer))!=-1){
如果(修改){
对于(int i=0;i
内存占用非常大,因为我的内存中有完整的字节数组(我们讨论的是内存大于2mb的位图)

我想我可以简单地扩展FileInputStream类,并在读取文件内容时进行字节操作。这将减少内存使用,因为我可以使用
Bitmap.decodeStream(inputstream)
而不是创建字节数组从中获取位图。。。但在这里我完全被卡住了。
read()
readBytes(…)
方法是本机方法,因此我无法覆盖它们


请在我的黑暗中传播光明…

溪流是用来包裹的。这就是为什么您经常看到这样的行:

InputStream is=new BufferedInputStream(new FileInputStream(file));
因此,创建一个执行解密的
DecryptingInputStream
,将另一个
InputStream
包裹起来


尽管如此,这并不难破解,因为你的解密密钥和算法将很容易被反编译你的应用程序的任何人确定。

FileInputStream不是你的问题。read()函数在每次调用时读取的大小不会超过默认的缓冲区大小。这是您对ByteArrayOutputStream的使用,它在您写入时占用了大量内存


如果您想减少所需的内存量,那么我建议您直接写入FileOutputStream,而不是ByteArrayOutputStream。因此,在从InputStream读取默认缓冲区大小时加密并写入磁盘。

只有final方法无法重写。read()和readBytes(…)方法可能是本机方法,但调用
super
并没有过时,上次我检查过。@Dan您能重写本机方法吗?我不这么认为…是的,这是有可能的,因为我已经写了代码,可以做到这一点。嗯,这种解密只是为了扰乱SD卡上的文件。只是为了阻止普通用户从手机复制文件。包装不会减少内存使用,对吗?我必须修改字节的方式是相同的。还是我错了?@WarrenFaith:“包装不会减少内存使用,对吗?”——它会像重写方法一样减少内存使用。我不会将其保存在磁盘上。它已加密保存在磁盘上。我需要在从磁盘读取时进行动态解密。由于我当前的实现在InputStream之外解密,我需要一个字节数组来执行解密。这就是我需要阵列的原因。我会尽量像建议的那样包装它。