IntelliJ“inputstream.read的结果被忽略” - 如何修复?

时间:2016-06-27 21:28:53

标签: java intellij-idea bytearray inputstream

我正在努力修复我的应用程序中的一些潜在错误。我正在使用Sonar来评估我的代码。我的问题是:

private Cipher readKey(InputStream re) throws Exception {
    byte[] encodedKey = new byte[decryptBuferSize];
    re.read(encodedKey); //Check the return value of the "read" call to see how many bytes were read. (the issue I get from Sonar)


    byte[] key = keyDcipher.doFinal(encodedKey);
    Cipher dcipher = ConverterUtils.getAesCipher();
    dcipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"));
    return dcipher;
}

这是否意味着字节数组为空?为什么被忽略? 我从来没有使用字节,所以我想知道这个问题究竟是什么意思以及如何解决它。感谢您的协助!

1 个答案:

答案 0 :(得分:3)

  

这是否意味着字节数组为空?

不 - 这不是错误

从定义:

中查看 read(byte [])方法
public abstract class InputStream extends Object implements Closeable {

     /**
     * Reads up to {@code byteCount} bytes from this stream and stores them in
     * the byte array {@code buffer} starting at {@code byteOffset}.
     * Returns the number of bytes actually read or -1 if the end of the stream
     * has been reached.
     *
     * @throws IndexOutOfBoundsException
     *   if {@code byteOffset < 0 || byteCount < 0 || byteOffset + byteCount > buffer.length}.
     * @throws IOException
     *             if the stream is closed or another IOException occurs.
     */
    public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException {

       ....
    }

}

那么IDE指示什么?你省略了read方法的结果 - 这是实际读取的字节数,如果是流的末尾则是-1已经到达。

  

如何解决?

如果你关心有多少字节被读取到字节缓冲区:

  // define variable to hold count of read bytes returned by method 
  int no_bytes_read = re.read(encodedKey);

为什么你应该关心???

  1. 因为当你从流中读取时,你经常作为参数传递一个缓冲区,特别是当你不知道流所携带的数据大小或你想要按部分读取时(在这种情况下你传递的decryptedBuferSize大小的字节数组) - &gt; 新字节[decryptBuferSize] )。
  2. 在开头字节缓冲区(字节数组)为空(用零填充)
  3. 方法read()/ read(byte [])从流
  4. 读取一个或多个字节
  5. 要知道“从流到缓冲区映射/读取”有多少字节,你必须得到read(byte [])方法的结果,这很有用,因为你不需要检查缓冲区的内容。
  6. 仍然在某些时候你需要从缓冲区获取数据/然后你需要知道缓冲区中数据的开始和结束偏移
  7. 例如:

     // on left define byte array   =  //  on right reserve new byte array of size 10 bytes 
      byte[] buffer =  new byte[10];
      // [00 00 00 00 00 00 00 00 00 00]  <- array in memory 
      int we_have_read = read(buffer);     // assume we have read 3 bytes 
      // [22 ff a2 00 00 00 00 00 00 00]  <- array after read 
    
     have we reached the end of steram or not ?  do we need still to read ? 
    
     we_have_read  ? what is the value of this variable ? 3 or -1 ? 
    
     if 3 ? do we need still read ? 
     or -1 ? what to do ? 
    

    我建议您详细了解 io nio api

    http://tutorials.jenkov.com/java-nio/nio-vs-io.html

    https://blogs.oracle.com/slc/entry/javanio_vs_javaio

    http://www.skill-guru.com/blog/2010/11/14/java-nio-vs-java-io-which-one-to-use/