2016-06-27 8 views
1

Ich arbeite an der Behebung einiger potentieller Fehler in meiner Anwendung. Ich verwende Sonar, um meinen Code zu bewerten. Mein Problem ist dies:IntelliJ "Ergebnis von inputstream.read wird ignoriert" - wie zu beheben?

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

Bedeutet dies, dass das Byte-Array leer war? Warum wird es ignoriert? Ich habe noch nie mit Bytes gearbeitet, also habe ich mich gefragt, was genau dieses Problem bedeutet und wie ich es angehen kann. Ich schätze Ihre Hilfe!

Antwort

2

Bedeutet dies, dass das Byte-Array leer war?

NO - das ist no't einen Fehler

Blick auf read (byte []) Methode aus Definition:

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 { 

     .... 
    } 

} 

so, was die IDE anzeigt ? ist das Sie das Ergebnis der Lesemethode - was ist die Anzahl der tatsächlich gelesenen Bytes oder -1, wenn das Ende des Streams erreicht wurde.

Wie zu beheben?

wenn u egal, wie viele Bytes Byte-Puffer gelesen wurden:

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

warum sollten Sie darauf ???

  1. , denn wenn man aus dem Strom lesen Sie als Parameter sind vorbei häufig speziell ein Puffer, wenn Sie nicht wissen, die Größe der Daten durch den Strom getragen wird, oder Sie wollen durch Abschnitte lesen (in diesem Fall, dass Sie vorbei Byte Array der entschlüsseltenBufferSize-Größe ->neues Byte [decryptBuferSize]).
  2. am Anfang des Byte-Puffer (Byte-Array) ist leer (mit Nullen aufgefüllt)
  3. Methode read()/Lese (byte []) ein oder viele Bytes lesen viele aus dem Strom
  4. bewusst zu sein, wie Bytes wurden "mapped/read from stream to buffer" Sie müssen das Ergebnis der read (byte []) Methode erhalten, dies ist nützlich, da Sie den Inhalt des Puffers nicht überprüfen müssen.
  5. noch an einem gewissen Punkt müssen Sie die Daten aus dem Puffer erhalten/dann müssen Sie den Anfang kennen und

zum Beispiel in einem Puffer der Daten-Offset Ende:

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

ich Sie ermutigen, lesen Sie mehr über io und 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/