读取/转换一个InputStream为一个字符串

如果你有java.io.InputStream对象,你应该如何处理这个对象并产生一个String

假设我有一个InputStream包含文本数据,我想将其转换为String。例如,我可以将流的内容写入日志文件。

什么是最简单的方法InputStream,并将其转换为String

public String convertStreamToString(InputStream is) { 
    // ???
}


男孩,我完全爱上了Java,但这个问题经常出现,你会认为他们只是想知道流的链接有点困难,要么帮助创建各种组合或重新考虑整个事情。

对这个问题的答案,只有当你想读取流的内容合作完全(直到它关闭)。由于这并不总是意图(具有保持活动连接的http请求将不会被关闭),所以这些方法调用阻止(不给你的内容)。

您需要知道并指定流的字符编码,否则出现字符编码错误,因为您将使用随机选择的编码,具体取决于您的代码在哪个机器/操作系统/平台或版本上运行。也就是说,不要使用依赖于平台的默认编码方法。

为了能够在9年前得到自己的评论,现在我使用Groovy的“String s = new File(”SomeFile.txt“)。text”来一次读取整个文件,效果很好。我很高兴使用groovy来处理我的非生产(脚本)代码,并且 - 诚实地迫使你处理编码和非常长的文件,java的方式对生产代码来说是一个非常好的主意,所以它适用于它的目的, Groovy适用于Java不擅长的快速脚本 - 只需使用正确的工具进行工作即可。

只是简化: ByteArrayOutputStream outputBytes = new ByteArrayOutputStream();for(byte[] b = new byte[512]; 0 < inputStream.read(b); outputBytes.write(b));return new String(outputBytes.toByteArray(), StandardCharsets.UTF_8);

答案

一个很好的方法来做到这一点是使用Apache的公共 IOUtils复制InputStreamStringWriter…类似的东西

StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);
String theString = writer.toString();

甚至

// NB: does not close inputStream, you can use IOUtils.closeQuietly for that
String theString = IOUtils.toString(inputStream, encoding); 

另外,ByteArrayOutputStream如果你不想混合你的Streams和Writer ,你可以使用它



这是一个只使用标准Java库的方法(注意流不关闭,YMMV)。

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

我从“愚蠢的扫描器技巧”文章中学到了这个技巧。它的工作原因是因为Scanner在流中迭代了令牌,在这种情况下,我们使用“输入边界的开始”(\ A)来分隔令牌,因此只给出了整个流内容的一个令牌。

请注意,如果您需要对输入流的编码进行具体说明,则可以向Scanner构造函数提供第二个参数,以指示要使用的字符集(例如“UTF-8”)。

帽子提示也去雅各,曾经指向我说的文章。

编辑:感谢来自Patrick的建议,使处理空输入流时更强大的功能。多一个编辑:不要尝试/抓住,帕特里克的方式更简洁。

添加评论

友情链接:蝴蝶教程