从HttpURLConnection创建一个InputStream的副本,以便它可以使用两次

Edu*_*rdo 7 string inputstream httpurlconnection

我用过这个问题

如何在Java中将InputStream转换为String?

使用以下代码将InputStream转换为String:

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

我的输入流来自HttpURLConnection InputStream,当我转换为String时,输入流发生变化,我不能再使用它了.这是我得到的错误:

Premature end of file.' SOAP
Run Code Online (Sandbox Code Playgroud)

当我使用正确的信息将其转换为字符串时,我该怎么做才能保留我的输入流?

特别地,这是改变的信息:

inCache = true (before false)
keepAliveConnections = 4 (before 5)
keepingAlive = false (before true)
poster = null (before it was PosterOutputStream object with values)
Run Code Online (Sandbox Code Playgroud)

谢谢.

mhs*_*ams 10

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

您可能需要创建具有相同数据的新输入流并使用它而不是原始数据.例如:

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);
Run Code Online (Sandbox Code Playgroud)

  • 该数字(4096)仅为缓冲区大小.你可以选择你喜欢的任何其他号码.没有读取它就找不到输入流大小.您可以使用InputStream.available(),但它将返回流中可用的当前字节数.实际上,流大小可能会在您阅读时发生变化.因此唯一有保证的解决方案是读取数据,直到您到达流的末尾. (2认同)