11
votes

À la recherche d'une byearrayInputStream à l'aide de Java.io

Comment puis-je rechercher (changer la position) d'un byteArrayInputStream ( java.io )? C'est quelque chose de tellement évident, mais je ne peux pas sembler trouver une méthode pour cela nulle part ( marquer / réinitialiser ne suffit pas, j'ai besoin de définir la position sur n'importe où sur le introuvable ).

S'il ne peut pas être fait en utilisant java.io et je dois passer à java.nio et utiliser un bytebuffer , comment peut-on Je reçois quelque chose de similaire à un dataOutputStream emballage A byteArrayOutPutStream à l'aide de java.nio ? Je ne trouve aucune sorte de mémoire tampon redimensionnable.

EDIT: J'ai trouvé un moyen d'obtenir ce que je tente de faire, mais c'est un peu désordonné. imageIO.CreateImageInputStream crée un imageInputStream , ce qui correspond exactement à ce que je veux (peut rechercher et lire des primitives). Cependant, en utilisant un byteArrayInputStream renvoie un filecacheimageinputtream , qui signifie essentiellement qu'il copie le tableau d'octets à un fichier juste pour rechercher.

C'est ma première fois d'essayer d'utiliser les classes Java IO et elle a été complètement négative. Il manque des fonctionnalités fondamentales (IMO), et il a de nombreuses façons de faire la même chose (par exemple, de lire des primitives à partir d'un fichier que vous pouvez utiliser aléatoireAccessfile , datagnutstream + FileInputStream , FileImageInputStream , FILECHANNEL + BYTEBUFFER , et peut-être encore plus).


3 commentaires

Voyez-vous un problème avec l'utilisation de rechercher ?


@Vilay Mathew: Qu'est-ce que recherche ? Je ne vois rien sur byearrayInputStream.


Les E / S en Java sont un énorme gâchis. J'enseigne aux étudiants de première année et j'essaie de le rendre simple, mais c'est toujours un point de confusion.


3 Réponses :


11
votes

Vous utiliseriez réinitialiser () code> / saute () code>. Je ne peux pas dire que c'est la plus belle API du monde, mais cela devrait fonctionner:

public void seek(ByteArrayInputStream input, int position)
    throws IOException
{
    input.reset();
    input.skip(position);
}


3 commentaires

Si Mark n'est pas appelé, la valeur par défaut de la position marquée est de 0% appelant la réinitialisation déplace le pointeur sur 0, puis la fonction de saut déplace le pointeur sur la position donnée.


@Sumitkumarsaha: Oui ... Je ne suis pas sûr du point de votre commentaire.


J'ajoutais juste votre réponse



1
votes

Il y a un byteArrayInputStream (octet (), int, int) constructeur qui vous donnera un flux d'entrée qui va lire jusqu'à un nombre donné d'octets à partir de un décalage donné. Vous pouvez utiliser ceci pour simuler la recherche d'un décalage arbitraire dans le flux.

Vous devez faire face au fait que "rechercher" vous donne un nouvel objet de flux, ce qui peut être gênant. Cependant, cette approche n'implique pas de copier des octets ni de les sauver dans un fichier, et il devrait être sûr de ne pas vous soucier de la fermeture des objets byearrayInputStream .


0 commentaires

6
votes

Si vous créez le byteArrayInputStream pour passer ailleurs, étendre la classe et manipuler POS (un protégé membre byteArrayInputStream < / code>) comme vous le souhaitez.


0 commentaires