java - 为什么我总是得到-1作为in.read(buf)的值?

标签 java encryption aes

(致版主)请注意,我之前曾发布过相关问题,但这是一篇更完整的帖子,因此请不要将其作为重复项关闭。您可以关闭之前的帖子。

每当我在控制台输出中得到-1时,就不会在输出流中写入数据,每当我在控制台输出中得到3时,有效数据就会写入输出流中。 -1和3在不同场合的出现是随机的。

这是代码

public void decrypt(InputStream in, OutputStream out) {
  try {
    // Bytes read from in will be decrypted
    in = new CipherInputStream(in, dcipher);

    // Read in the decrypted bytes and write the cleartext to out
    int numRead = 0;
    System.out.println(in.read(buf));
    while ((numRead = in.read(buf)) >= 0) {
      out.write(buf, 0, numRead);
    }
    //out.close();
  }
  catch (java.io.IOException e) {
  }
}

这是控制台输出

the Cell Content : ¼OKs>N?h¸GX&ŸH
-1
the Cell Content : 3Ëù%¥þ-]'±ŠM݆
3
the Cell Content : ´`?û…óï>»†µýÆ$
-1
the Cell Content : 9ûÊ‘øxIÐ8`ýÊeú
3
the Cell Content : •x€ÌWã’ç4æ~?Gû{
-1
the Cell Content : ÉJ‹SD
-1
the Cell Content : ¯'´öƒ²wCÐ)/
3
the Cell Content : ¼?\š
-1
the Cell Content : 4¤¢ÃUÚړ‹ïEk?É•
-1
the Cell Content : vì=¨;°e¼~{GÀ“È"?
3
the Cell Content : 0ò*"MoañôefU?ô?
-1
the Cell Content : –çä,M9"kIF FJÅ
3
the Cell Content : ¬¼aâÅ•b鉭-SoP~Æ
3
the Cell Content : œ¦LKØ•0I¾>n=á
3
the Cell Content : Å'?X °¡¯“nJ/0è˜
3
the Cell Content : 3™æ&‡õvâr`õ_4¾õ
3
the Cell Content : l羚jT/`‚«h™&
3
the Cell Content : ~à‘_X;eÜ$8º!šŒì
3
the Cell Content : ùݳ9ˆ>‰Liœr‡
3
the Cell Content : UzÛ,­»è–­Üí‡AB®µ
3
the Cell Content : ’ùZnë¥æFó¦–ñ?~
-1
the Cell Content : 4ê¶È˜¬ ”Ôÿ4vä
3

这是对解密函数的调用。

InputStream excelResource=new FileInputStream(path);
Workbook rwb=Workbook.getWorkbook(excelResource);
int sheetCount=rwb.getNumberOfSheets();
Sheet rs = rwb.getSheet(0);
int rows = rs.getRows();
int cols = rs.getColumns();
for(int i=0; i<rows; i++) {
  for(int j=0; j<Col.length; j++) {
    String theCell_00 = rs.getCell(j,i).getContents();
    System.out.println("the Cell Content : " + theCell_00);

    in = new ByteArrayInputStream(theCell_00.getBytes());
    out = new FileOutputStream("c:\\Decrypted.txt");
    encrypter.decrypt(in, out);

创建输入流的 Excel 文件在每个单元格上都有数据,这些数据显示在控制台输出中的单元格内容中。请帮助我找出为什么即使使用有效的输入流(看起来像)我也会得到 -1控制台输出。

最佳答案

删除这行无意义的行:

System.out.println(in.read(buf));

确实将数据读入缓冲区,但您进一步忽略了它!您在 while 语句中执行的下一个调用不会读回相同数据,但只会读回下一个数据超出缓冲区长度的字节。如果您真的感兴趣,最好在循环内执行 numRead 的 sysout。

另一个问题是您将 in 参数替换为 另一个 InputStream:

in = new CipherInputStream(in, dcipher);

将其分配给自己的局部变量并保持方法参数不变。最好的办法是在将来声明它们final,这样编译器就会给出错误。例如

public void decrypt(final InputStream in, final OutputStream out)

或者,您也可以将 IDE 配置为在覆盖方法参数时显示警告(这通常是一种不好的做法)。例如,在 Eclipse 中,您可以通过 Java> 编译器> 错误/警告> 名称隐藏和冲突>将全部设置为警告错误

关于java - 为什么我总是得到-1作为in.read(buf)的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1796991/

相关文章:

java - 构造函数是必要的还是仅仅为了方便而使用?

c# - 在 WSO2 APIM/DSS 服务中使用自定义密码加密

go - 如何检查随机性?

c# - AES 在 .NET 中加密并使用 Node.js 加密解密?

java - 运行打包为 .jar 的 JOGL 项目时找不到路径

java - 如何在动画之前和之后执行 Action

ios - AES256 大于 32Bytes

python - 使用 Node.js AES CTR 加密并使用 PyCrypto 解密

java - 获取对java中包含类的引用

PHP 和 Javascript 兼容的加密函数