java:StringBufferOutputWriter还是StringBufferOutputStream?
我需要捕获一个异常并获取一个字符串,该字符串将使用java:StringBufferOutputWriter还是StringBufferOutputStream?,java,stream,Java,Stream,我需要捕获一个异常并获取一个字符串,该字符串将使用printStackTrace()打印 看起来最简单的方法是调用printStackTrace(X),其中X将PrintStream或PrintWriter子类化,并将其收集到StringBuilder并返回字符串 这样的事情存在吗?若否,有何建议 edit:skaffman发布了一个使用getStackTrace()的解决方案。(你或版主能取消删除吗?)这实际上是唯一“正确”的解决方案。在StringWriter之上使用PrintWriter的
printStackTrace()
打印
看起来最简单的方法是调用printStackTrace(X)
,其中X将PrintStream
或PrintWriter
子类化,并将其收集到StringBuilder
并返回字符串
这样的事情存在吗?若否,有何建议
edit:skaffman发布了一个使用getStackTrace()
的解决方案。(你或版主能取消删除吗?)这实际上是唯一“正确”的解决方案。在StringWriter之上使用PrintWriter的问题是,尽管它很容易工作,但对于深堆栈跟踪,它并不能打印所有元素。您需要的是
您可以将其传递到PrintWriter的构造函数中,然后对StringWriter或toString()调用getBuffer()以获取最终字符串。您需要的是
您可以将其传递到PrintWriter的构造函数中,然后对StringWriter或toString()调用getBuffer(),以获取最终字符串。您可以调用Throwable.getStackTrace()
,而不是printStackTrace
,它返回StackTraceeElement[]
?您仍然需要做一些工作才能将其转换为字符串,但与使用字符串缓冲区之类的工具相比,这无疑是一个更干净的解决方案
一旦拥有了stackTraceeElement[]
,就可以对其进行操作。可能是printStackTrace
指定的布局并不真正适合您将要使用它的目的,而StackTraceElement
对象模型提供的更明确的格式为您提供了更多的控制。毕竟,这就是它提供的功能。如何不调用printStackTrace
,而是调用Throwable.getStackTrace()
,它返回StackTraceElement[]
?您仍然需要做一些工作才能将其转换为字符串,但与使用字符串缓冲区之类的工具相比,这无疑是一个更干净的解决方案
一旦拥有了stackTraceeElement[]
,就可以对其进行操作。可能是printStackTrace
指定的布局并不真正适合您将要使用它的目的,而StackTraceElement
对象模型提供的更明确的格式为您提供了更多的控制。毕竟,这就是它提供的功能。在其com.google.common.base.Throwables类中包含以下内容:
public static String getStackTraceAsString(Throwable throwable) {
StringWriter sw = new StringWriter();
throwable.printStackTrace(new PrintWriter(sw));
return sw.toString();
}
在其com.google.common.base.Throwables类中包含以下内容:
public static String getStackTraceAsString(Throwable throwable) {
StringWriter sw = new StringWriter();
throwable.printStackTrace(new PrintWriter(sw));
return sw.toString();
}
是的,这就是我在想的,我只是不知道打印每个StackTraceElement有多难。呃,转换成字符串,而不是打印出来。究竟为什么实现自己版本的printStackTrace而不是使用Gonzo牧师的解决方案应该是一个更干净的解决方案?重新实现JDK功能属于我对“丑陋的黑客行为”的定义。Jason特别要求使用printStackTrace()打印的字符串。是的,我这样做了,但有时考虑更大的问题比更直接的回答更有优势。是的,我就是这么想的,我只是不知道打印出每个StackTraceElement有多难。呃,转换成字符串,而不是打印出来。究竟为什么实现自己版本的printStackTrace而不是使用Gonzo牧师的解决方案是一个更干净的解决方案?重新实现JDK功能属于我对“丑陋的黑客行为”的定义。Jason特别要求使用printStackTrace()打印的字符串。是的,我这样做了,但有时考虑更大的问题比更直接的回答更有利。这是我本来打算采用的方法,我投了赞成票,但它对深层堆栈跟踪效果不好。好吧,这是我打算的方法,我投票通过了,但对深层堆栈跟踪效果不好。是的,这是我根据Gonzo牧师的回答所做的,但对深层堆栈跟踪效果不好。你确定它不会打印所有元素吗?你看到的是“…还有更多”这样的东西吗?是否存在链接异常?当链式异常和链式异常共享多个(在本例中为26个)帧时,就会发生这种情况。这只是一个节省空间和使事情更清楚的简单方法。但您仍然可以看到输出中表示的每一帧。此处解释:是的,这是我根据Gonzo牧师的回答所做的,但它同样不适用于深堆栈跟踪。你确定它不会打印所有元素吗?你看到的是“…还有更多”这样的东西吗?是否存在链接异常?当链式异常和链式异常共享多个(在本例中为26个)帧时,就会发生这种情况。这只是一个节省空间和使事情更清楚的简单方法。但您仍然可以看到输出中表示的每一帧。解释如下: