Java 当我用AES加密或解密一个文件时,文件末尾会有奇怪的字符,这是缓冲区问题还是AES问题?

Java 当我用AES加密或解密一个文件时,文件末尾会有奇怪的字符,这是缓冲区问题还是AES问题?,java,file,encryption,Java,File,Encryption,我想加密一些数据,稍后再解密。当我这样做时,文件的结尾会有奇怪的字符 当它是一个小文件时,我试图修复缓冲区大小。但是当文件更大时,我假设缓冲区中存在一些奇怪的值,这些值只是放在文件中,而没有刷新,或者放在磁盘上的其他地方。 但是我不知道如何处理那些我不知道确切大小的大文件 我该怎么做才能在不超过我正在读/写的确切文件大小的情况下拥有更动态的缓冲区 私有静态无效写入字节文件输入流fis、ByteArrayOutputStream BAS、FileOutputStream fos、long inSi

我想加密一些数据,稍后再解密。当我这样做时,文件的结尾会有奇怪的字符

当它是一个小文件时,我试图修复缓冲区大小。但是当文件更大时,我假设缓冲区中存在一些奇怪的值,这些值只是放在文件中,而没有刷新,或者放在磁盘上的其他地方。 但是我不知道如何处理那些我不知道确切大小的大文件

我该怎么做才能在不超过我正在读/写的确切文件大小的情况下拥有更动态的缓冲区

私有静态无效写入字节文件输入流fis、ByteArrayOutputStream BAS、FileOutputStream fos、long inSize 抛出IOException{ InputStreamReader isr=新的InputStreamReaderfis; int read=0; int bufsize=inSize<1024?Math.toIntExactinSize:1024; 字节[]buf=新字节[bufsize]; 当read=fis.readbuf>0时{ 字节[]ret=buf; //我想我应该让这里更有活力,因为我只需要 //新的读取数据 回合++; ret=startEncryptionret,baos; fos.writeret; } fos.flush; fos.close; fis.close; } INPUTFILE.txt

然后加密,然后解密

OUTPUTFILE.txt


有一些奇怪的值。

您总是在处理整个缓冲区,即使最后一次读取很可能不会完全填满缓冲区。您需要使用read变量来知道读取了多少字节,然后只处理字节[],直到达到该限制。

您始终在处理整个缓冲区,即使最后一次读取很可能不会完全填满缓冲区。您需要使用read变量来知道读取了多少字节,然后只处理字节[],直到达到该限制

    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);
或者,如果存在此类重载方法,则传递限制信息:

    ... (buf, 0, read);
顺便说一下

不要对读取器使用文本输入—实际上您并没有使用它:

除去

InputStreamReader isr = new InputStreamReader(fis);
或至少指示读取字节的编码方式:

InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);

非常感谢。这就是问题所在。我发现read返回值比什么都不读或什么都不读更有意义。这正是我需要的。非常感谢。我看到了这个确切的行为被记录在案。。。我应该更仔细地阅读。同时,我也有更多的阅读部分。我通过将系统字符集的属性设置为UTF 8:system.setPropertyfile.encoding,UTF-8来避免这种情况;charset=charset.class.getDeclaredFielddefaultCharset;charset.setAccessibletrue;setnull,null;你认为这也可以还是可取?谢谢!这就是问题所在。我发现read返回值比什么都不读或什么都不读更有意义。这正是我需要的。非常感谢。我看到了这个确切的行为被记录在案。。。我应该更仔细地阅读。同时,我也有更多的阅读部分。我通过将系统字符集的属性设置为UTF 8:system.setPropertyfile.encoding,UTF-8来避免这种情况;charset=charset.class.getDeclaredFielddefaultCharset;charset.setAccessibletrue;setnull,null;你认为这也可以吗?是的,这是我认为我不知道该怎么做的。现在我也知道read参数不仅仅意味着只读或不读。现在它开始工作了。谢谢是的,我想我不知道该怎么办。现在我也知道read参数不仅仅意味着只读或不读。现在它开始工作了。非常感谢。