Filtre (recherche et remplacement) tableau d'octets dans un InputStream
J'ai un InputStream qui prend le fichier html comme paramètre d'entrée. Je dois obtenir les octets du flux d'entrée .
J'ai une chaîne de caractères: "XYZ"
. Je voudrais convertir cette chaîne d'octet de format et de vérifier si il y a un match pour la chaîne dans la séquence d'octets que j'ai obtenue à partir de l'InputStream. Si il y a ensuite, je dois remplacer le match avec l'au revoir la séquence pour une autre chaîne.
Est-il quelqu'un qui pourrait m'aider? J'ai utilisé les regex pour rechercher et remplacer. cependant la recherche et le remplacement de flux d'octets, je ne suis pas au courant de.
Précédemment, j'utilise jsoup pour analyser le code html et remplacer la chaîne, mais en raison de quelques problèmes d'encodage utf, le fichier apparaît endommagé lorsque je le fais.
TL;DR: Ma question est:
Est un moyen de rechercher et remplacer une chaîne de caractères en nombre d'octets format raw d'un InputStream en Java?
Pourquoi convertir les chaînes de tableaux d'octets et de les comparer entre eux, au lieu de comparer les chaînes d'origine?
Fondamentalement, ce que vous avez besoin est tutorials.jenkov.com/java-howto/... .
OriginalL'auteur | 2011-10-12
Vous devez vous connecter pour publier un commentaire.
Pas sûr que vous avez choisi la meilleure approche pour résoudre votre problème.
Cela dit, je n'aime pas (et n'ont comme politique de ne pas) répondre à des questions avec "ne" alors voilà...
Ont un coup d'oeil à
FilterInputStream
.À partir de la documentation:
C'était un exercice amusant à écrire. Voici un exemple complet pour vous:
Exemple D'Utilisation
Donné les octets de la chaîne
"Hello xyz world"
il imprime:M
est la longueur du motif etN
est la longueur du fichier. Aussi, selon ce que vous recherchez, en ignorant la structure HTML peut vous causer des ennuis.bon point, et je suis complètement d'accord avec vous. Je viens de faire la partie que je pensais être le fun 🙂 ne pas même de mettre en œuvre toutes les méthodes de lecture..
Merci beaucoup pour vos conseils.
Pas de problème. Vous êtes les bienvenus.
Essayez de trouver des new byte[] { (byte) 0xFF, (byte) 0x00} vous serez surpris Vous devez utilisateur byte_value & 0xFF valeurs octet->entier plutôt simple d'écrire byte_value Par exemple outQueue.offre((int) b); doit être outQueue.offre((int) (b&0xFF));
OriginalL'auteur aioobe
J'ai besoin de quelque chose comme ceci aussi bien et a décidé de mettre mon propre solution au lieu de l'aide de l'exemple ci-dessus par @aioobe. Jetez un oeil à la code. Vous pouvez le retirer de la bibliothèque de maven central, ou tout simplement copier le code source.
C'est la façon dont vous l'utiliser. Dans ce cas, je suis en utilisant une étude de l'instance, afin de remplacer deux modèles deux fix dos et mac les fins de ligne.
new ReplacingInputStream(new ReplacingInputStream(is, "\n\r", "\n"), "\r", "\n");
Voici le code source complet:
OriginalL'auteur Jilles van Gurp
L'approche suivante va fonctionner, mais je ne sais pas comment le gros de l'impact sur les performances.
InputStream
avec unInputStreamReader
,InputStreamReader
avec unFilterReader
qui remplace les cordes, puisFilterReader
avec unReaderInputStream
.Il est essentiel de choisir le codage approprié, sinon le contenu du flux de corruption.
Si vous souhaitez utiliser des expressions régulières pour remplacer les cordes, puis vous pouvez utiliser Streamflyer, un outil de la mienne, qui est une alternative pratique à la
FilterReader
. Vous trouverez un exemple de flux d'octets sur la page web de Streamflyer. Espérons que cette aide.Pouvez-vous veuillez donner un exemple de code ?
OriginalL'auteur rwitzel
Il n'y a pas une fonctionnalité intégrée de recherche et de remplacement sur les flux d'octets (
InputStream
).Et, une méthode pour remplir cette tâche efficacement et correctement n'est pas immédiatement évidente. J'ai mis en œuvre la Boyer-Moore algorithme pour les cours d'eau, et il fonctionne bien, mais il a fallu un certain temps. Sans un algorithme de ce genre, vous avez recours à une force brute approche où vous cherchez le modèle de départ à chaque position dans le flux, qui peut être lent.
Même si vous décoder le HTML en texte, à l'aide d'une expression régulière correspondant aux modèles pourraient être une mauvaise idée, depuis le HTML n'est pas un "régulier" de la langue.
Donc, même si vous avez quelques difficultés, je vous propose de poursuivre votre approche originale de l'analyse le code HTML d'un document. Lorsque vous rencontrez des problèmes avec l'encodage des caractères, il sera probablement plus facile, dans le long terme, de fixer la solution qu'il sera de jury-rig la mauvaise solution.
OriginalL'auteur erickson
J'ai besoin d'une solution à cela, mais a trouvé les réponses ici encourus trop de mémoire et/ou de la charge du CPU. Ci-dessous la solution de manière significative surpasse les autres ici, en ces termes sur une simple analyse comparative.
Cette solution est particulièrement efficace de la mémoire, qui n'entraînera aucun coût mesurable, même avec >GO ruisseaux.
Cela dit, ce n'est pas un zéro-CPU-coût de la solution. Le CPU/temps de traitement supplémentaire n'est probablement raisonnable pour tous, mais les plus exigeants en ressources sensibles scénarios, mais la surcharge est réel et doit être considéré lors de l'évaluation de la solvabilité de l'employeur de cette solution dans un contexte donné.
Dans mon cas, notre max dans le monde réel la taille du fichier que nous sommes de traitement est d'environ 6MO, où nous voyons un temps de latence supplémentaire d'environ 170 ms avec 44 URL de remplacement. C'est pour un Zuul-fonction reverse-proxy en cours d'exécution sur AWS ECS avec un seul PROCESSEUR action (1024). Pour la plupart des fichiers (moins de 100 KO), le temps de latence supplémentaire est sous-ordre de la milliseconde. En vertu de haute concurrence (et donc de contention du PROCESSEUR), le temps de latence supplémentaire pourrait augmenter, mais nous sommes actuellement en mesure de traiter des centaines de fichiers en même temps sur un seul nœud sans humainement perceptible de la latence de l'impact.
La solution que nous utilisons:
OriginalL'auteur rees