“关闭”输出流
不幸的是,我正在使用一个任性的库,它会将信息打印到 System.out (或偶尔打印到 System.err )。防止这种情况最简单的方法是什么?
我一直在考虑创建一个到内存的输出流,在每次调用其中一个麻烦方法之前替换 System.out 和 err ,稍后恢复它们,然后忽略创建的流的缓冲区。有没有更简单、更优雅的方法?
编辑:我不想重定向所有输出 - 这很容易完成。我只想忽略某些库调用可能生成的输出。
I'm using a wayward library that, unfortunately, prints information to System.out
(or occasionally System.err
). What's the simplest way to prevent this?
I've been thinking about creating an output stream to memory, replace System.out
and err
before every call to one of the troublemaking methods, restore them later, and just ignore the buffer of the created stream. Is there an easier, more elegant way?
EDIT: I don't want to redirect all output - that's easily accomplished. I only want to ignore output potentially generated by certain library calls.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我最终做了类似的事情:
感谢 AlexR 和 stacker 将我重定向到这个简短的解决方案。
I ended up doing something like:
Thanks to AlexR and stacker for redirecting me to this short solution.
永久消除这些不需要的打印的一种方法是使用字节码操作从有问题的库中删除打印语句。例如,可以使用 ASM (或其他更高级别且更易于使用的AOP 框架)。
您可以在运行时执行此操作,也可以将其作为重写库的类文件的一次性操作。请参阅 ASM 的文档以了解具体操作方法。这是一个概念证明。它的作用是将所有对
System.out
的引用替换为对PrintStream
的引用,而后者不执行任何操作。首先是测试。他们使用我的项目中的一些实用程序类来帮助测试字节码转换(测试它需要创建一个自定义类加载器并将字节码转换应用于正确的类,但不应用于任何其他类)。
然后就是实施。请注意,在没有首先理解此代码的情况下,您不应该使用它。不要巧合地编程。
A way to get rid of those unwanted prints permanently would be to use bytecode manipulation to remove the print statements from the troublesome library. This can be done for example using ASM (or one of the other higher level and easier to use AOP frameworks).
You can do this either at runtime or as a one-time operation of rewriting the library's class files. Refer to ASM's documentation to find out how. Here is a proof of concept. What it does is that it replaces all references to
System.out
with a reference to aPrintStream
which does nothing.First the tests. They use some utility classes from my project to help with testing bytecode transformations (testing it requires creating a custom class loader and applying the bytecode transformations to the right class but not any other classes).
And then the implementation. Please note that you should not use this code without first understanding it. Do not program by coincidence.
有两种方法。
1.最简单的方法是运行程序并将所有输出重定向到 /dev/null (如果您使用的是 unix)或将被删除的特殊文件(对于 windows)
这种方法虽然简单,但是意味着你的所有输出都将化为乌有。如果你的程序使用 STDOUT 来做好事,你就不能使用这种方式。
您可以使用 java API 设置 STDOUT。
系统.setOut(输出)
System.setErr(out)
现在您可以实现自己的OutputStream:
这更好,因为您可以过滤掉不相关的输出并打印好的信息。
There are 2 ways.
1. the simplest way is to run your program and redirect all output to /dev/null (if you are on unix) or to special file that will be removed (for windows)
This way is simple but it means that all your output is going to nothing. If your program uses STDOUT for good things you cannot use this way.
You can set STDOUT using java API.
System.setOut(out)
System.setErr(out)
Now you can implement your own OutputStream:
This is better because you can filter out irrelevant output and print good information.