Frage

Wie kann ich tun, on-the-fly-Suche & in einem Java-Stream (Eingang oder Ausgang) ersetzen?

Ich will nicht, um den Strom in den Speicher laden oder in eine Datei.

Ich sehe nur das Bytes vorbei und ich brauche ein paar Ersatz zu tun. Die Sequenzen sind kurz ersetzt (bis zu 20 Bytes).

War es hilfreich?

Lösung

Sie können die Klasse verwenden, zur Verfügung gestellt hier , wenn statische Ersetzungsregeln für Sie genug sind.

Andere Tipps

Sie können ein deterministische endliche Automaten implementieren die an jedem Byte sieht nur einmal (zB keine Lookbehind ist) erforderlich, so dass Sie im Grunde die Eingabe über einen Puffer hält max so viele Zeichen wie die Länge Ihres Musters streamen würden, auf einem Spiel, das Muster ausgibt oder überfüllt (nicht angepasst) Zeichen, wenn in dem Muster voran. Runtime ist linear nach der Herstellung des Musters.

Wikipedia hat einige Informationen über Pattern-Matching und wie die in der Theorie funktioniert .

Ich habe ein paar gute Ideen von dem darin enthaltenen Link und am Ende eine kleine Klasse zu schreiben Ersatz von $ VAR $ Variablen in einem Strom zu handhaben. Für die Nachwelt:

public class ReplacingOutputStream extends OutputStream {
    private static final int DOLLAR_SIGN = "$".codePointAt(0);
    private static final int BACKSLASH = "\\".codePointAt(0);
    private final OutputStream delegate;
    private final Map<String, Object> replacementValues;

    private int previous = Integer.MIN_VALUE;
    private boolean replacing = false;
    private ArrayList<Integer> replacement = new ArrayList<Integer>();


    public ReplacingOutputStream(OutputStream delegate, Map<String, Object> replacementValues) {
        this.delegate = delegate;
        this.replacementValues = replacementValues;
    }

    public @Override void write(int b) throws IOException {
        if (b == DOLLAR_SIGN && previous != BACKSLASH) {
            if (replacing) {
                doReplacement();
                replacing = false;
            } else {
                replacing = true;
            }
        } else {
            if (replacing) {
                replacement.add(b);
            } else {
                delegate.write(b);
            }
        }

        previous = b;
    }

    private void doReplacement() throws IOException {
        StringBuilder sb = new StringBuilder();
        for (Integer intval : replacement) {
            sb.append(Character.toChars(intval));
        }
        replacement.clear();

        String oldValue = sb.toString();
        Object _newValue = replacementValues.get(oldValue);
        if (_newValue == null) {
            throw new RuntimeException("Could not find replacement variable for value '"+oldValue+"'.");
        }

        String newValue = _newValue.toString();
        for (int i=0; i < newValue.length(); ++i) {
            int value = newValue.codePointAt(i);
            delegate.write(value);
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top