2015-11-23 4 views

Répondre

3

Si l'entrée est toujours un byte[], alors vous avez raison, il n'y a souvent pas besoin du flux. Et if you don't need it, don't use it. Un avantage supplémentaire d'un ByteArrayInputStream est qu'il indique très clairement que vous voulez que les octets soient en lecture seule (puisque le flux ne fournit pas d'interface pour les changer), mais il est important de noter qu'un programmeur peut souvent encore accéder aux octets directement, donc vous ne devriez pas utiliser cela dans une situation où la sécurité est une préoccupation.

Mais si c'est parfois un byte[], parfois un fichier, parfois une connexion réseau, etc, alors vous avez besoin d'une sorte d'abstraction pour "un flux d'octets, et je me fous d'où ils viennent." C'est ce qu'est un InputStream. Lorsque la source est un tableau d'octets, ByteArrayInputStream est un bon InputStream à utiliser.

Ceci est utile dans de nombreuses situations, mais de donner deux exemples concrets:

  • Vous écrivez une bibliothèque qui prend les octets et les traite en quelque sorte (peut-être c'est une bibliothèque de traitement d'images, par exemple). Les utilisateurs de votre bibliothèque peuvent fournir des octets à partir d'un fichier ou d'un byte[] en mémoire ou d'une autre source. Donc, vous fournissez une interface qui accepte un InputStream - ce qui signifie que si ce qu'ils ont est un byte[], ils doivent l'envelopper dans un ByteArrayInputStream.
  • Vous écrivez du code qui lit une connexion réseau. Mais pour tester ce code unitaire, vous ne voulez pas avoir à ouvrir une connexion; vous voulez juste fournir quelques octets dans le code. Ainsi, le code prend un InputStream, et votre test fournit un ByteArrayInputStream.
3
  • A ByteArrayInputStream contient une mémoire tampon interne qui contient des octets qui peuvent être lus à partir du flux. Un compteur interne conserve la trace de l'octet suivant à fournir par la méthode de lecture.
  • ByteArrayInputStream est comme emballage qui protège tableau sous-jacent de la modification externe
  • Il a ordre élevé lu, marque, sauter les fonctions
  • Un flux a également l'avantage que vous ne devez pas avoir tous les octets en mémoire à en même temps, ce qui est pratique si la taille des données est grande et peut facilement être manipulée en petits morceaux.

    Reference doc

  • Où que si vous choisissez byte[], alors vous devez générer des roues pour faire la lecture, sauter et de suivre l'index actuel explicitement

    byte data[] = { 65, 66, 67, 68, 69 }; // data 
        for (int index = 0; index < data.length; index++) { 
         System.out.print((char) data[index] + " "); 
        } 
        int c = 0; 
        ByteArrayInputStream bInput = new ByteArrayInputStream(data); 
        while ((bInput.read()) != -1) { 
         System.out.println(Character.toUpperCase((char) c)); 
        }