7

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


    }

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

提前谢谢你。

4

2 回答 2

4

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

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 中,代码非常标准。缺点:它隐藏了调用者的替换逻辑(有时这也是一个专业,仍然取决于用例)

高温高压

于 2012-05-02T07:50:15.087 回答
2

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

如果刚刚收集的堆栈已经与您的条件不匹配,只需将堆栈刷新到输出并再次收集它。

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

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

于 2012-05-02T07:41:16.943 回答