我如何进行即时搜索&在Java Stream(输入或输出)中替换?

我不想将流加载到内存或文件中。

我只看到经过的字节,我需要做一些替换。被替换的序列很短(最多20个字节)。

有帮助吗?

解决方案

您可以使用此处提供的课程如果静态替换规则足够你。

其他提示

您可以实施确定性有限自动机,仅查看每个字节一次(例如否lookbehind是必需的),这样你基本上可以通过一个缓冲区来输入输入,该缓冲区最多可以保存与模式长度相同的字符数,在模式中前进时输出匹配或溢出(不匹配)字符的模式。准备好模式后,运行时是线性的。

维基百科在理论上有一些关于模式匹配及其运作方式的信息。

我从提供的链接中得到了一些好主意,最后编写了一个小类来处理流中$ VAR $变量的替换。后人:

public class ReplacingOutputStream extends OutputStream {
    private static final int DOLLAR_SIGN = "<*>quot;.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);
        }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top