【问题标题】:Create a copy of an InputStream from an HttpURLConnection so it can be used twice从 HttpURLConnection 创建 InputStream 的副本,以便可以使用两次
【发布时间】:2012-10-28 15:46:56
【问题描述】:

我用了这个问题

How do I convert an InputStream to a String in Java?

使用以下代码将 InputStream 转换为字符串:

public static String convertStreamToString(java.io.InputStream is) {
    java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
    return s.hasNext() ? s.next() : "";
} 

我的输入流来自 HttpURLConnection InputStream,当我转换为字符串时,输入流发生了变化,我无法再使用它。这是我得到的错误:

Premature end of file.' SOAP

当我将输入流转换为包含正确信息的字符串时,我能做些什么来保留它?。

具体来说,这是变化的信息:

inCache = true (before false)
keepAliveConnections = 4 (before 5)
keepingAlive = false (before true)
poster = null (before it was PosterOutputStream object with values)

谢谢。

【问题讨论】:

  • Eduardo:您是否可以创建另一个 InputStream 并将其用于第二个客户端?在此方法(convertStreamToString)中读取数据后,您可以将此数据放回另一个流(例如:ByteArrayInputStream),然后将其发送到需要从输入流中读取相同数据的第二个客户端。
  • 嗨 Mohammad,我想我不完全明白你的意思。您能否回复提供更多详细信息的问题?如果它工作正常,我会非常乐意给你我的赏金。是的,您对另一个问题的评论是正确的,我需要保持我的 InputStream 完整,然后将其正确转换为 SOAP 消息。谢谢!。

标签: string inputstream httpurlconnection


【解决方案1】:

如果您将输入流传递到扫描仪或以任何其他方式读取其数据。您实际上正在使用它的数据,并且该流中将不再有可用数据。

您可能需要创建一个具有相同数据的新输入流并使用它来代替原始输入流。例如:

ByteArrayOutputStream into = new ByteArrayOutputStream();
byte[] buf = new byte[4096];

// inputStream is your original stream. 
for (int n; 0 < (n = inputStream.read(buf));) {
    into.write(buf, 0, n);
}
into.close();

byte[] data = into.toByteArray();

//This is your data in string format.
String stringData = new String(data, "UTF-8"); // Or whatever encoding  

//This is the new stream that you can pass it to other code and use its data.    
ByteArrayInputStream newStream = new ByteArrayInputStream(data);

【讨论】:

  • 我看到你放了 4096,效果很好。但是如何获取输入流的大小?,我没有看到 getsize 方法?谢谢!。
  • 那个数字 (4096) 只是缓冲区大小。您可以选择您喜欢的任何其他号码。不阅读就无法找到输入流的大小。您可以使用 InputStream.available(),但它会返回流中可用的当前字节数。事实上,在您阅读它的过程中,流的大小可能会发生变化。所以唯一有保证的解决方案是读取数据,直到您到达流的末尾。
【解决方案2】:

扫描器一直读取到流的末尾并关闭它。所以它不会进一步可用。使用PushbackInputStream 作为输入流的包装器并使用unread() 方法。

【讨论】:

  • 嗨安东尼,我相信你是对的。但是,我如何使用您提到的 unread() 方法?非常感谢!!!。
  • @Antony 使用 PushbackInputStream 您不能取消读取原始 InputStream 中的数据。我认为 Eduardo 需要保持原始 InputStream(来自 URL 连接的那个)完好无损。
【解决方案3】:

尝试使用 Apache 实用程序。 在我的预设项目中,我也做过同样的事情

InputStream xml = connection.getInputStream();

字符串响应数据 = IOUtils.toString(xml);

您可以从 Apache [import org.apache.commons.io.IOUtils] 获取 IOUtils

【讨论】:

  • 嗨,实际上这是在我发布的问题中评论的,我试过了。但是我也在消耗我的输入流,最后它是不合适的。谢谢!。
  • 您可以根据需要多次使用字符串数据。由于无法向后读取流,因此您将面临很多问题以获得此类支持
  • 是的,我可以根据需要多次使用该字符串,但是我需要两次输入流,一次转换为字符串(以了解我应该使用的正确 SOAP 版本),然后第二次将输入流转换为 SOAP 消息。
  • 我仍然无法使用 String 而不是 Stream 获取 SOAP 消息的问题。
  • 无法将字符串转换为 SOAP 消息,只能转换为输入流。
猜你喜欢
  • 2012-09-10
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 2020-05-25
  • 1970-01-01
  • 2017-03-14
相关资源
最近更新 更多