是否有人知道如何读取解密文件而不将其重写为原始文件?
下载文件后,文件自动加密。当我想打开文件时,文件将首先被解密,但问题是如何从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();
}
我可以打开解密文件,但如果我使用上面的代码,它将在加密文件和原始文件之间复制。
答案 0 :(得分:1)
FileOutputStream fos = new FileOutputStream(file1 + "/decrypted.json");
将作为第一个参数传入的File对象写入decrypt方法
decrypt(File file1 ...
这也是您正在阅读的文件对象。
因此,当您执行fos.write(d, 0, b);
时,您正在写回该File对象,该对象与您正在读取的对象相同。
所以要么写入不同的文件,要么根本不写任何东西。
新的FileOutputStream
方法可以采用文件名而不是文件对象,如所述here相关的摘录状态
FileOutputStream(String name, boolean append)
创建文件输出流以使用指定的文件写入文件 名称。如果第二个参数为true,则将写入字节 文件的结尾而不是开头。一个新的FileDescriptor 创建对象以表示此文件连接。
首先,如果有安全管理器,则调用其checkWrite方法 以名字为参数。
如果文件存在但是是目录而不是常规文件,那么 不存在但无法创建,或无法打开任何其他 之所以抛出FileNotFoundException。
所以也许你想要FileOutputStream fos = new FileOutputStream("/decrypted.json", true|false)
将第二个参数设置为true或false,具体取决于您是否要将文件追加或覆盖?
为您的问题提供一个精确的解决方案有点困难,因为您没有明确说明您想要的结果是什么,所以我做了一些可能错误的假设,但无论哪种方式,上述方法都可以帮助您找到所需的解决方案