(致版主)请注意,我之前曾发布过相关问题,但这是一篇更完整的帖子,因此请不要将其作为重复项关闭。您可以关闭之前的帖子。
每当我在控制台输出中得到-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/