Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java:StringBufferOutputWriter还是StringBufferOutputStream?_Java_Stream - Fatal编程技术网

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个)帧时,就会发生这种情况。这只是一个节省空间和使事情更清楚的简单方法。但您仍然可以看到输出中表示的每一帧。解释如下: