Android从CipherInputStream读取文件而不重写文件

Android从CipherInputStream读取文件而不重写文件,android,encryption,Android,Encryption,是否有人知道如何读取解密文件而不将其重写为原始文件 下载文件后,文件会自动加密。当我想打开文件时,文件将首先被解密,但问题是如何从CipherInputStream读取文件,这样就不需要将文件转换回原始文件 void decrypt(File file1, String nama) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { md5

是否有人知道如何读取解密文件而不将其重写为原始文件

下载文件后,文件会自动加密。当我想打开文件时,文件将首先被解密,但问题是如何从CipherInputStream读取文件,这样就不需要将文件转换回原始文件

void decrypt(File file1, String nama) throws IOException, NoSuchAlgorithmException,
        NoSuchPaddingException, InvalidKeyException {

    md5 hash = new md5();
    String sapi = hash.md5(nama);

    FileInputStream fis = new FileInputStream(file1+ "/" + sapi);

    FileOutputStream fos = new FileOutputStream(file1 + "/decrypted.json");

    SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(),
            "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, sks);
    CipherInputStream cis = new CipherInputStream(fis, cipher);
    int b;
    byte[] d = new byte[8];
    while ((b = cis.read(d)) != -1) {
        fos.write(d, 0, b);
    }

    fos.flush();
    fos.close();
    cis.close();

}
我可以打开解密的文件,但如果我使用上面的代码,它将在加密文件和原始文件之间复制

FileOutputStream fos = new FileOutputStream(file1 + "/decrypted.json"); 
写入作为解密方法的第一个参数传入的文件对象

decrypt(File file1 ...
这也是您正在读取的文件对象。 所以当你做
fos.write时(d,0,b)您正在写回文件对象,该文件对象与您正在读取的对象相同

因此,要么写入另一个文件,要么根本不写任何东西。 新的
FileOutputStream
方法可以采用文件名,而不是相关摘录状态所述的文件对象

FileOutputStream(字符串名称, 布尔(追加)

创建文件输出流,以使用指定的 名称如果第二个参数为true,则将写入字节 文件的结尾而不是开头。一种新的文件描述符 对象被创建来表示此文件连接

首先,如果有安全管理器,则调用其checkWrite方法 以名称作为其参数

如果文件存在,但它是目录而不是常规文件,则 不存在但无法创建,或无法为任何其他文件打开 然后引发FileNotFoundException

因此,您可能需要
FileOutputStream fos=newfileoutputstream(“/decrypted.json”,true | false)

根据是否要附加或覆盖文件,将第二个参数设置为true或false


要为您的问题提供准确的解决方案有点困难,因为您没有清楚地说明您想要的结果是什么,所以我做了一些假设,这些假设可能是错误的,但无论哪种方式,如果您不想将数据写入
文件超流
,以上内容都应该可以帮助您找到所需的解决方案,只需将其替换为
ByteArrayOutputStream