Привет, у меня проблемы с прерыванием операции шифрования.
В своем коде я шифрую файл и читаю его в память, а также проверяю состояние сброса, которое предполагает остановку шифрования.
Идея состоит в том, чтобы повысить производительность, прерывая операции, которые больше не запрашиваются пользователем.
Вот пример кода
Cihper cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.DECRYPT_MODE, someKey, someIV);
ByteArrayOutputStream out = new ByteArrayOutputStream();
try (InputStream in = new FileInputStream(someFile);
CipherOutputStream cipherStream = new CipherOutputStream(out, cipher)) {
int bytesRead;
byte[] buffer = new byte[16 * 1024];
while ((bytesRead = in.read(buffer)) > -1) {
if (checkAbortCondition()) { //should abort
return; //auto-closes the stream, this throws an exception!!
}
cipherStream.write(buffer, 0, bytesRead);
}
//more work...
} catch (Exception e) {
//exception handling
}
Я получаю BadPaddingException
, когдазакрытие потока заранее, это означает, что поток не завершил шифрование всех данных в файле.
бит трассировки стека:
java.io.IOException: javax.crypto.BadPaddingException
2019-05-16 12:39:38.722 11145-11665/com.bubu.android W/System.err: at javax.crypto.CipherOutputStream.close(CipherOutputStream.java:214)
Q: есть ли способзакрыть CipherOutputStream
без исключения?что-то вроде «прервать», который не будет вызывать doFinal()
?