将InputStream转换为Stream<String>,给定一个字符集。

39

我想将InputStream is转换为一个Stream<String> stream,并指定Charset cs,使得streamis的每一行组成。此外,is的每一行都不应立即读取,只有在stream需要时才应该读取。


你尝试过什么?问题应该展示出你的努力,包括尝试或研究。 - Dioxin
2
它一定要是InputStream吗?如果你要读取文件,那么可以使用Files.lines(Path path, Charset cs)。你可以查看这个方法的源代码来找到解决方案。 - Pshemo
在我的情况下,它是来自HttpURLConnection#getInputStream()的输入流。 - principal-ideal-domain
好的,我已经这样做了。请参见https://dev59.com/r4vda4cB1Zd3GeqPUAra - principal-ideal-domain
1个回答

67

我认为你可以尝试:

Stream<String> lines = new BufferedReader(new InputStreamReader(is, cs)).lines();

有没有一种方法可以在完整读取InputStream后自动断开HttpURLConnection的连接? - principal-ideal-domain
1
您可以在 try-with-resources 语句中读取流,并可能添加一个 finally 块,该块调用 HttpURLConnection 对象上的 disconnect() 方法:http://docs.oracle.com/javase/7/docs/api/java/net/HttpURLConnection.html#disconnect() - Costi Ciudatu
2
使用 try( BufferedReader br=new BufferedReader(new InputStreamReader(is, cs)); Stream<String> lines=br.lines() ) { /* your stream operation */ } 即可。 - Holger
1
如果您需要更多灵活性来定义模式,这也是不错的选择:new Scanner(is).findAll(<pattern>)。 - Aleksander Lech
1
Apache Commons IO提供了一个AutoCloseInputStream,当流到达末尾时会自动关闭它。这样,您就可以安全地返回此Stream,而无需将其包装在try-with-resources中。例如:new BufferedReader(new InputStreamReader(new AutoCloseInputStream(is), cs)).lines()(顺便说一句@principal-ideal-domain,如果您仍然需要这个信息7年后...) - Jelaby
我不喜欢 BufferedReader。有没有办法将输入流(例如 System.in)转换为 Path 对象,以便我可以像这样键入 Files.lines(InputStreamPathObject, charset) - Sergey Zolotarev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接