L'utilisation de BufferedInputStream
Permettez-moi de commencer ce post avec une seule attention. Je suis un total débutant quand il s'agit de Java. J'ai été la programmation PHP sur et en dehors pendant un certain temps, mais j'étais prête à faire une application de bureau, j'ai donc décidé d'aller avec Java pour diverses raisons.
L'application que je suis en train de travailler sur est dans les premiers stades (moins de 5 classes) et j'ai besoin de lire des octets à partir d'un fichier local. Généralement, les fichiers sont actuellement moins de 512 ko (mais peut augmenter dans le futur). Actuellement, je suis en utilisant un FileInputStream
pour lire le fichier en trois tableaux d'octets, qui a parfaitement satisfait mes exigences. Cependant, j'ai vu un BufferedInputStream
mentionné, et je me demandais si la façon dont je suis en train de faire ce qui est le mieux, ou si je dois utiliser un BufferedInputStream
ainsi.
J'ai fait quelques recherches et avoir lu quelques questions ici, sur un Débordement de Pile, mais je suis toujours avoir des problèmes de compréhension de la meilleure situation pour savoir quand utiliser et ne pas utiliser le BufferedInputStream
. Dans ma situation, le premier tableau, j'ai lu les octets en seulement quelques octets (moins de 20). Si les données que je reçois est bon dans ces octets, puis j'ai lu le reste du fichier, en plus de deux tableaux d'octets de taille variable.
J'ai aussi entendu beaucoup de gens parler de profilage pour voir laquelle est la plus efficace dans chaque cas particulier, cependant, je n'ai pas de profilage de l'expérience et je ne suis pas vraiment sûr où commencer. J'aimerais quelques suggestions à ce sujet.
Je suis désolé pour ce long post, mais j'ai vraiment envie d'apprendre et de comprendre la meilleure façon de faire ces choses. J'ai toujours une mauvaise habitude de deuxième deviner mes décisions, donc j'aimerais quelques commentaires. Merci!
Vous devez vous connecter pour publier un commentaire.
Si vous êtes constamment les petites lit ensuite un
BufferedInputStream
vous donnera de bien meilleures performances. Chaque demande de lecture sur un tampon de flux entraîne, en général, un appel système pour le système d'exploitation pour lire le nombre d'octets. La surcharge de faire un appel système est peut-être des milliers d'instructions machine par syscall. Un tampon de flux réduit en faisant un grand lire pour (dire) jusqu'à 8k octets dans une mémoire tampon interne, puis de distribuer des octets de la mémoire tampon. Cela peut réduire considérablement le nombre d'appels système.Toutefois, si vous êtes constamment faire grand lit (par exemple, 8k ou plus) puis un
BufferedInputStream
ralentit les choses. Généralement, vous n'avez pas de réduire le nombre d'appels, et la mise en mémoire tampon introduit un supplément de copie de données à l'étape.Dans votre cas d'utilisation (où vous lisez une de 20 octets morceau d'abord, puis beaucoup de gros morceaux), je dirais que l'utilisation d'un
BufferedInputStream
est plus susceptible de réduire les performances que de l'augmenter. Mais en fin de compte, cela dépend de la lecture des schémas.However, if you are consistently doing large reads (e.g. 8k or more) then a BufferedInputStream slows things.
Comment?Si vous utilisez une relativement grande des tableaux pour lire les données d'un morceau à un moment, puis
BufferedInputStream
sera juste introduire un gaspillage de la copie. (Rappelez-vous,read
n'est pas nécessairement lire l'ensemble de la matrice - vous pourriez vouloirDataInputStream.readFully
). OùBufferedInputStream
gagne, c'est quand beaucoup de petites lectures.ByteArrayInputStream
, qui est unInputStream
qui se lit à travers unbyte[]
n'a donc pas de réelle I/O. Si vous êtes à la lecture par le biais de votrebyte[]
octet par octet, vous trouverez probablement à l'aide d'unBufferedInputStream
ouByteArrayInputStream
simplifie votre code à un certain coût. (Remarque, ne pas mélanger à l'aideBufferedInputStream
avec l'aide du flux sous-jacent, parce que les anciens tampons.BufferedInputStream lit plus les fichier dont vous avez besoin à l'avance. Ce que je comprends, c'est de faire plus de travail à l'avance, comme, 1 gros continue la lecture du disque vs faire beaucoup dans une boucle serrée.
Autant que le profilage - j'aime le profiler qui est intégré à netbeans. Il est vraiment facile à prendre en main. 🙂
Je ne peux pas parler pour le profilage, mais de mon expérience dans le développement d'applications Java je trouve que l'utilisation de tampon classes - BufferedInputStream, StringBuffer - mes applications sont exceptionnellement rapide. À cause de qui, je le les utiliser, même pour la plus petite des fichiers ou des opération de chaîne.
read()
octet par octet et quand utiliserread(byte[])
tableau de byte. Comme je pense que la lecture de la matrice est toujours mieux. alors pouvez-vous me donner des exemples d'utilisation deread()
octet par octet OUread(byte[])
tableau de byte. OUBufferedInputStream
.?