Filter (suchen und ersetzen) array von bytes in einen InputStream
Ich habe einen InputStream, welcher der html-Datei als input-parameter. Ich muss die bytes aus dem input-stream .
Ich habe einen string: "XYZ"
. Ich möchte konvertieren von string zu byte-format und überprüfen Sie, ob es eine übereinstimmung für die Zeichenfolge in byte-Sequenz, die ich aus den erhaltenen InputStream. Wenn es dann, ich habe zu ersetzen, um die übereinstimmung mit den bye-Sequenz für eine andere Zeichenfolge.
Gibt es jemand, der mir helfen könnte? Ich habe verwendet, regex suchen und ersetzen. jedoch suchen und ersetzen von byte-stream, ich bin bewusst.
Zuvor, ich benutze jsoup Parsen von html und ersetzen Sie die Zeichenfolge, jedoch wegen einiger utf-Kodierung Probleme, die Datei scheint beschädigt angezeigt werden, wenn ich das tun.
TL;DR: Meine Frage ist:
Ist ein Weg, um suchen und ersetzen eines Strings in byte-format in eine raw-InputStream in Java?
InformationsquelleAutor der Frage | 2011-10-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht sicher, dass Sie gewählt haben, ist der beste Ansatz, Ihr problem zu lösen.
Sagte, ich mag nicht (und haben in der Politik nicht zu) beantworten Sie die Fragen mit "nicht" so, hier geht...
Haben Sie einen Blick auf
FilterInputStream
.Aus der Dokumentation:
Es war eine lustige übung, um es zu schreiben. Hier ist ein vollständiges Beispiel für Sie:
Beispiel Für Die Verwendung
Angesichts der bytes für den string
"Hello xyz world"
es druckt:InformationsquelleAutor der Antwort aioobe
Folgende Ansatz funktionieren wird, aber ich weiß nicht, wie groß die Auswirkungen auf die Leistung.
InputStream
mit einemInputStreamReader
,InputStreamReader
mit einemFilterReader
ersetzt die strings, dannFilterReader
mit einemReaderInputStream
.Ist es entscheidend, wählen Sie die entsprechende Codierung, ansonsten wird der Inhalt der stream beschädigt.
Wenn Sie möchten, verwenden Sie reguläre Ausdrücke, um zu ersetzen die Saiten, dann können Sie Streamflyerein tool von mir, das ist eine gute alternative zum
FilterReader
. Finden Sie ein Beispiel für byte-streams auf der Webseite von Streamflyer. Hoffe, das hilft.InformationsquelleAutor der Antwort rwitzel
Brauchte ich so etwas wie gut und beschlossen, roll meine eigene Lösung statt mit dem Beispiel oben von @aioobe. Haben Sie einen Blick auf die code. Sie können ziehen Sie die Bibliothek aus dem maven-central, oder kopieren Sie einfach den Quellcode.
Dies ist, wie Sie es verwenden. In diesem Fall verwende ich eine verschachtelte Instanz zu ersetzen, die zwei Muster zwei fix dos-und mac-Zeilenenden.
new ReplacingInputStream(new ReplacingInputStream(is, "\n\r", "\n"), "\r", "\n");
Hier ist der vollständige code:
InformationsquelleAutor der Antwort Jilles van Gurp
Gibt es keine integrierten Funktionen für die Suche-und-ersetzen auf byte-streams (
InputStream
).Und, eine Methode, die diese Aufgabe effizient und korrekt, ist nicht sofort offensichtlich. Ich habe Erfahrung in der Boyer-Moore-Algorithmus für Datenströme, und es funktioniert gut, aber es hat einige Zeit gedauert. Ohne einen Algorithmus, wie diese, Sie haben zu greifen, um einer brute-force-Ansatz, bei dem Sie suchen Sie für die Muster, beginnend an jeder position im stream,die langsam sein kann.
Selbst wenn Sie decodiert den HTML-Code als text, mit einem regulären Ausdruck, um Muster zu vergleichen könnte eine schlechte Idee, seit HTML ist keine "normale" Sprache.
So, obwohl Sie ' ve stoßen einige Schwierigkeiten, ich schlage vor, Sie verfolgen Ihre ursprünglichen Ansatz der Analyse der HTML-Code als ein Dokument. Während Sie Probleme mit der Zeichenkodierung, wird es wohl einfacher sein, auf lange Sicht zu beheben, die richtige Lösung als es sein wird, um jury-rig die falsche Lösung.
InformationsquelleAutor der Antwort erickson
Brauchte ich eine Lösung, aber die Antworten, die hier anfallen, zu viel Speicher und/oder CPU-overhead. Meine Lösung funktioniert für meinen Gebrauch Fall, ohne Frage, aber ich kann nicht Versprechen, es ist einwandfrei, wie eine Allgemeine Lösung.
Dies ist vor allem Speicher-effiziente, entstehen keine messbaren Kosten, auch mit >GB-streams.
Allem, dies ist nicht eine zero-cost-Lösung. Die CPU - /Verarbeitungs-Zeit Aufwand ist so gering wie ich es am morgen zwicken, und es ist wohl sinnvoll für alle, aber die meisten anspruchsvollen/Ressource-empfindliche Szenarien, aber der Aufwand ist real und sollte berücksichtigt werden bei der Bewertung der Kreditwürdigkeit der Einsatz dieser Lösung in einem gegebenen Kontext.
In meinem Fall unsere max-real-world-Datei Größe, die wir sind, die Verarbeitung ist über 6MB, wo wir sehen Latenz von etwa 170ms mit 44 Ersatz. Dies ist für eine Zuul-basierte reverse-proxy läuft auf AWS ECS mit einem single-CPU-Aktie (1024). Für die meisten Dateien (unter 100KB), die Latenz ist im sub-Millisekundenbereich. Unter hoher Parallelität (und damit CPU-Konflikte bestehen), die Latenz erhöhen könnte, aber wir sind derzeit in der Lage, Hunderte von Dateien, die gleichzeitig auf einem einzelnen Knoten mit kein menschlich-spürbare Latenz auswirken.
Die Lösung, die wir verwenden:
InformationsquelleAutor der Antwort rees