2016-06-27 25 views
1

私はアプリケーションでいくつかの潜在的なバグを修正するために取り組んでいます。私はソナーを使ってコードを評価しています。私の問題は次のとおりです。IntelliJ "inputstream.readの結果は無視されます" - 修正方法?

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; 
} 

これは、バイト配列が空であることを意味しますか?なぜそれは無視されていますか? 私はバイトで作業したことがないので、この問題が何を意味し、どのように対処できるのだろうと思っていました。私はあなたの援助に感謝します!

答えて

2

これは、バイト配列が空であることを意味しますか?

NO - これはリード(バイト[])の定義から方法でエラー

ルックno'tある:IDEを示すものそう

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 { 

     .... 
    } 

} 

の場合、の読み込みメソッドの結果を実際に読み込んだバイト数、またはストリームの最後に達した場合は-1を省略したです。

修正方法?

uはバイトのバッファに読み取られたバイト数を気にしている場合:

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

あなたが気にしなければならない理由は?

  1. この場合には(あなたは、あなたが流れによって運ばれるデータのサイズがわからないとき、多くの場合、バッファ特別にパラメータとして渡されたストリームから読み込まれたり、一部で読みたいお渡しバイト理由decryptedBuferSizeサイズの配列 - >新しいバイト[decryptBuferSize])。
  2. 冒頭バイトバッファ(バイト配列)
  3. (ゼロで満たされた)空で読み取る方法()/(バイト[])を読み取る多くの方法を認識するストリーム
  4. からの1つのまたは多くのバイトを読んでいますバイトが "ストリームからバッファにマップされ/読み込まれました"ので、read(byte [])メソッドの結果を取得する必要があります。これは、バッファの内容を確認する必要がないので便利です。
  5. は、まだいくつかの点であなたは、バッファからデータを取得する必要があります/あなたは始まりを知っていて、例えばバッファ内のデータのオフセット

を終了する必要があります。

// 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

01についての詳細を読みます

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/

関連する問題