我想加密一些数据,稍后再解密。当我这样做时,文件末尾将出现奇怪的字符。
我试图在缓冲区较小的文件中修复它的大小。但是,当文件较大时,我假设它们只是被放入文件中的缓冲区中的异常值,不会被刷新或位于磁盘上的其他位置。但我不知道该如何处理非常大的文件,我不知道确切的大小。
我可以做些什么来拥有更多动态缓冲区,而又不超过我正在读写的确切文件大小?
private static void writeBytes(FileInputStream fis, ByteArrayOutputStream baos, FileOutputStream fos, long inSize)
throws IOException {
InputStreamReader isr = new InputStreamReader(fis);
int read = 0;
int bufsize = inSize < 1024 ? Math.toIntExact(inSize) : 1024;
byte[] buf = new byte[bufsize];
while ((read = fis.read(buf)) > 0) {
byte[] ret = buf;
//I think i should make it here more dynamica because i only need
//the new read data
rounds++;
ret = startEncryption(ret, baos);
fos.write(ret);
}
fos.flush();
fos.close();
fis.close();
}
INPUTFILE.txt
Hello StackOverflow
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
Some more Values exceeding 1024 Bytes
Some more Values exceeding 1024 Bytes
Some more Values exceeding 1024 Bytes
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
Bye StackOverflow
然后加密然后解密
OUTPUTFILE.txt
Hello StackOverflow
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
Some more Values exceeding 1024 Bytes
Some more Values exceeding 1024 Bytes
Some more Values exceeding 1024 Bytes
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
Bye StackOverflowAZØgZ—»:ÔU
ßøëdKBqDûî=üõU,Ôžð~S¤‘H—[„FUùP!S?ª7+Xnf ´ŸŸ‰Q¡yB3ÑJ€†€Þt2
:ÂSø¿#¡™,Íô1L䕲{nÿb>òVc•<ùhÇéJŒìÄ퀕¿šãe5³X”ââªüÄUÐNØÛzc!oläÃÝ“ª9iÛÂÐ êÞ¡Þ)òSþ-Ðét½ |ˆ&š'wÌAr9ö[ì·K$rI2¸ˆÕ5õ[1X¿°¹W¡'Ù>ñg–…$}‘˜mnòÛò¢zÔŠÍBØÊH¸[®âù l+½&ˆ¸´üô°Žùdz資oÆ=ó×.ôNÛºi{z·ˆcø¯þÁ›<n?»Ñµ¼¼üÌ Y÷ÎCÚAbýK¡ƒÿÈù‡)´ž|/Åÿˆ(ë¤_ï|ÛL=¹Ã7¾JXº¿ÍoIŸY¬ôÍÙQÀÒ¸~ò!aËæÆ×"(›Ÿ¥¹°‚_ ‹Qj‚†a‰3)‰{Ãç|e
有一些奇怪的值。
while ((read = fis.read(buf)) > 0) {
byte[] ret = Arrays.copyOf(buf, read);
或者如果有这样的重载方法,则传递限制信息:
... (buf, 0, read);
顺便说一句] >>
不要在阅读器上使用文本输入(实际上您确实没有使用它):
删除
InputStreamReader isr = new InputStreamReader(fis);
或至少指示读取的字节在哪种编码中:
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
您总是在处理整个缓冲区,即使最后一次读取很可能不会完全填满缓冲区。您需要使用read
变量来知道读取了多少字节,然后仅处理byte[]
直至达到该限制。