【问题标题】:replace a string segment from input stream从输入流中替换字符串段
【发布时间】:2012-05-02 07:32:36
【问题描述】:

我正在尝试接收一个巨大的文本文件作为输入流,并希望将一个字符串段转换为另一个字符串。我很困惑如何做到这一点,如果我将整个输入流转换为我不想要的字符串,它会很好地工作,因为某些内容会丢失。任何人都可以请帮助如何做到这一点? 例如 如果我有一个包含“这是需要修改的测试字符串”内容的文件。我想接受这个字符串作为输入流,并想将内容修改为“这是被修改的测试字符串”,(通过用 is 替换 'needs to be')。

    public static void main(String[] args) {
        String string = "This is the test string which needs to be modified";
        InputStream inpstr = new ByteArrayInputStream(string.getBytes());
           //Code to do


    }

在此我希望输出为:这是已修改的测试字符串

提前谢谢你。

【问题讨论】:

  • 我会逐行读取输入流(通过 BufferedReader)并在发送到输出之前对整行执行替换。更优雅的方式,从 BufferedReader 继承我的 WholeLineChangerInputStream,覆盖 readLine() 方法(应用替换)并使用它 ^^
  • 基本上你需要这个:tutorials.jenkov.com/java-howto/… 然后将其应用到输入流

标签: java inputstream


【解决方案1】:

如果要更改的文本总是适合一个逻辑行,正如我在评论中所说,我会使用简单的行阅读(如果适用)使用类似的东西:

public class InputReader {
    public static void main(String[] args) throws IOException
    {
        String string = "This is the test string which needs to be modified";
        InputStream inpstr = new ByteArrayInputStream(string.getBytes());

        BufferedReader rdr = new BufferedReader(new InputStreamReader(inpstr));
        String buf = null;
        while ((buf = rdr.readLine()) != null) {
            // Apply regex on buf

            // build output
        }
    }
}

但是我一直喜欢使用继承,所以我会在某个地方定义它:

class MyReader extends BufferedReader {
    public MyReader(Reader in)
    {
        super(in);
    }

    @Override
    public String readLine() throws IOException {
        String lBuf = super.readLine();
        // Perform matching & subst on read string
        return lBuf;
    }
}

并使用 MyReader 代替标准 BufferedReader 将替换隐藏在 readLine 方法中。

优点:替换逻辑在指定的 Reader 中,代码非常标准。 缺点:它向调用者隐藏了替换逻辑(有时这也是一个优点,仍然取决于用例)

HTH

【讨论】:

  • 谢谢它的帮助.. 但问题是当我有一个字符串在上一行中有一些部分在下一行中.. 我遇到了模式匹配问题.. 我正在尝试解决出来了。。
  • 在这种情况下,最好按照 Nikolay 的建议使用堆栈机。我会将它嵌入到自定义 InputStream(或 BufferedReader)中。写起来可能有点棘手,但会涵盖 99% 的情况。
  • @BigMike 该解决方案仅涵盖readLine() 方法,仍然read()read(char[]) 保留未替换的数据源。我正在寻找正确的解决方案,但即使是 Apache Commons IO 也没有正确的实现(issues.apache.org/jira/browse/IO-218 abadonned 在 2013 年)。
  • 当然,但它是正确的(在 2012 年)并且它仍然是正确的(2015 年),因为 OP 需要在整行上执行搜索和替换,这意味着缓存读取数据,这意味着比简单的 Reader 扩展更复杂的解决方案。您可以覆盖其他读取方法,但您需要保留读取数据的窗口以执行搜索和替换。
【解决方案2】:

可能我理解错了,但我认为你应该构建一个堆栈机器。我的意思是您可以使用一个小的字符串堆栈来收集文本并检查替换条件。

如果刚刚收集的堆栈已经不符合您的条件,只需刷新堆栈以输出并再次收集。

如果您的堆栈与条件相似,请继续收集。

如果您的堆栈与您的条件匹配,请进行修改并将修改后的堆栈刷新到输出。

【讨论】:

猜你喜欢
  • 2015-07-06
  • 2017-04-28
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
相关资源
最近更新 更多