java读文件一个字节数组_java – 将文件读取到多个字节数组

在Java中查找密码流.您可以使用它们来动态加密/解密流,这样您就不必将整个内容存储在内存中.您所要做的就是将源文件的常规FileInputStream复制到CipherOutputStream,后者将FileOutputStream包装为加密的接收器文件. IOUtils甚至方便地包含一个副本(InputStream,OutputStream)方法来为您执行此复制.

例如:

public static void main(String[] args) {

encryptFile("exampleInput.txt", "exampleOutput.txt");

}

public static void encryptFile(String source, String sink) {

FileInputStream fis = null;

try {

fis = new FileInputStream(source);

CipherOutputStream cos = null;

try {

cos = new CipherOutputStream(new FileOutputStream(sink), getEncryptionCipher());

IOUtils.copy(fis, cos);

} finally {

if (cos != null)

cos.close();

}

} finally {

if (fis != null)

fis.close();

}

}

private static Cipher getEncryptionCipher() {

// Create AES cipher with whatever padding and other properties you want

Cipher cipher = ... ;

// Create AES secret key

Key key = ... ;

cipher.init(Cipher.ENCRYPT_MODE, key);

}

如果您需要知道复制的字节数,如果文件大小超过Integer.MAX_VALUE字节(2 GB),则可以使用IOUtils.copyLarge而不是IOUtils.copy.

要解密文件,请执行相同的操作,但使用CipherInputStream而不是CryherOutputStream并使用Cipher.DECRYPT_MODE初始化您的密码.

查看here以获取有关Java密码流的更多信息.

这将节省您的空间,因为您不再需要存储自己的字节数组.此系统中唯一存储的byte []是Cipher的内部字节[],每当输入足够的输入并且Cipher.update返回加密块时,或者当CipherOutputStream关闭时,Cipher.doFinal将返回该字节[] .但是,您不必担心任何此问题,因为它都是内部的,所有内容都是为您管理的.

编辑:请注意,这可能导致忽略某些加密异常,尤其是BadPaddingException和IllegalBlockSizeException.这个行为可以在CipherOutputStream source code中找到.(当然,这个源来自OpenJDK,但它可能在Sun JDK中做同样的事情.)另外,从CipherOutputStream javadocs:

This class adheres strictly to the semantics, especially the failure semantics, of its ancestor classes java.io.OutputStream and java.io.FilterOutputStream. This class has exactly those methods specified in its ancestor classes, and overrides them all. Moreover, this class catches all exceptions that are not thrown by its ancestor classes.

这里的粗体线意味着忽略了加密异常,它们就是这样.这可能会在尝试读取加密文件时导致一些意外行为,尤其是对于块和/或填充加密算法(如AES).请记住这一点,您将获得加密(或解密为CipherInputStream)文件的零或部分输出.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值