Java 替换打印流中的文本
是否可以在printstream中替换regexp 我有一段代码记录控制台窗口中显示的所有文本,但它也记录ANSI转义代码 我发现这个regexpJava 替换打印流中的文本,java,regex,replace,printstream,Java,Regex,Replace,Printstream,是否可以在printstream中替换regexp 我有一段代码记录控制台窗口中显示的所有文本,但它也记录ANSI转义代码 我发现这个regexp“s:\x1B\[[0-9;]*[mK]::g”可以删除它们,但这只适用于字符串。 有没有一种方法可以将正则表达式替换应用于常量字符串流并过滤掉ANSI转义码 如果可能的话,尽量让它安静下来,当谈到编程时,我还是一个新手,我只是在一个已经存在的程序的基础上进行构建 编辑: 我在堆栈溢出上的其他地方找到了这段代码,这使我可以同时流到日志文件和控制台 这就
“s:\x1B\[[0-9;]*[mK]::g”
可以删除它们,但这只适用于字符串。
有没有一种方法可以将正则表达式替换应用于常量字符串流并过滤掉ANSI转义码
如果可能的话,尽量让它安静下来,当谈到编程时,我还是一个新手,我只是在一个已经存在的程序的基础上进行构建
编辑:
我在堆栈溢出上的其他地方找到了这段代码,这使我可以同时流到日志文件和控制台
这就是我所用的,然后我开始发球
Logging tee = new Logging(file, System.out);
在调用适当的
super
方法之前,您可以对有问题的打印流进行子类化,并执行regexp替换
public void ExampleStream extends PrintStream {
@Override
public void print(String s) {
super(s.replaceAll(ANSI_PATTERN,""));
}
}
创建
FilterOutputStream
的子类,比如RegeOutputStream
。该类应该缓冲写入它的所有数据(来自不同的write(…)
方法)。在flush()
方法中,它应该应用正则表达式,然后将结果写入底层的OutputStream
接下来,实例化PrintWriter
以写入RegexOutputStream
。这样,您就不需要更改PrintWriter
类的行为。如果您不想再进行过滤,您可以将RegexOutStream从链中取出,一切都将再次工作
请注意,根据您如何使用
PrintWriter
,这可能会导致RegexOutputStream
s缓冲区变得相当大。如果您将PrintWriter
创建为自动刷新,它将在每一行和每一字节数组之后刷新。有关详细信息,请参阅它。我认为Logging
类中的代码不正确一个好的方法(至少目前是这样):
- 如果您可以访问PrintStream源代码,您可能会发现当前重新定义的方法可能根本没有被使用:PrintStream#print(…)方法在textOut#write(…)(而不是在重新定义的OutputStream#write(…)上进行委托
- 因此,您应该重新定义print(String)和print(char[])方法,以便有效地过滤输出
- 答案中有几个重定义方法的例子(包括下面的例子)
- 复制一个
类。按您喜欢的方式命名。(例如TrimAnsiBufferedStream)bufferedoutstream
- 然后重新定义de flushBuffer()方法:
- 当您需要实例化一个取代ANSI的PrintStream时,调用
newPrintStream(newTrimanSiBufferedStream(nestedStream))
- 这可能不是防弹的(例如,编码配置可能发生的任何情况,或者缓冲区大小不够大,或者printstream中的刷新选项),但我不会将其过度复杂化
顺便说一句。欢迎kukelekuuk00。请务必阅读常见问题解答和答案反馈(我们关心您,请回馈).你的问题现在解决了吗?如果是,理想情况下你应该将其作为答案重新发布,并将其标记为接受。如果不是,你能解释一下这对你的问题有何影响吗?@DuncanJones这是我已经存在的代码,我只是不知道如何编辑打印流(System.out)将ANSI代码从输出流中过滤到我的文件中。我假设,其他人假设,您需要一个过滤掉ANSI的打印流(如开头所述)。然后在编辑中,它讨论了您正在使用的其他代码(这恰好是一个输出副本)。因此,请确保:您想要获得您的代码(打印到两个输出)也可以过滤出正则表达式。不是吗?(也许应该从一开始就说得更清楚)打印和写入有很多风格。print(String)和其他print()方法在write(String)上委托。如果重新定义write(String)会更好,但如果使用print(char[])则不够好(例如).Oops,对不起,我编辑了答案,我本想在自己的编辑中将文字转换为常量。我无法还原它。@Javier没问题,它改进了我的答案。我在理解如何做这件事上遇到了困难,我对编程非常陌生,也没有做太多java编程。我复制了BufferedOutputStream()但我真的不知道我是否做得对,以及如何使用它。谢谢你,我会的。@kukelekuuk00我不知道如何进一步解释。虽然我可能会剥夺你解决这个问题的机会,但你有这个类的代码:()。希望能帮到你。我会仔细看看你做了什么,然后继续。这个想法(实现为FilterOutputStream)是正确的,但是请求者要求的东西更详细(新手)。我碰巧也有同样的想法。
public void ExampleStream extends PrintStream {
@Override
public void print(String s) {
super(s.replaceAll(ANSI_PATTERN,""));
}
}
private void flushBuffer() throws IOException {
if (count > 0) {
String s = new String(buf, 0, count); // Uses system encoding.
s.replaceAll(ANSI_PATTERN, "");
out.write(s.getBytes());
count = 0;
}
}