从InputStream读取并追加到String

时间:2015-07-16 13:52:52

标签: java inputstream

我尝试了两种差异方法从InputStream读取字节并将内容附加到字符串/打印字符串:

1。)

buffer= new byte[32768];
   while((read= is.read(buffer))>0){
          System.out.println(new String(buffer));
    }

2。)

     BufferedReader br = null;
     StringBuilder sb = new StringBuilder();
     String line;
     br = new BufferedReader(new InputStreamReader(is));
        while ((line = br.readLine()) != null) {
               sb.append(line);
        }
      br.close();

虽然第二种方法有效,但第一种方法只获得前几个字节并停止。

有人可以告诉我方法1有什么问题吗?

4 个答案:

答案 0 :(得分:2)

方法1是错误的,因为它没有考虑is.read(buffer)读入缓冲区的实际字节数

方法2错误,因为它丢弃了行尾字符。

考虑java.nio.file.Files.readAllBytes或readAllLines

答案 1 :(得分:1)

第一种方法失败,因为您忽略了is.read(buffer)返回的值。 无保证,InputStream.read将填充您的字节数组。这就是该方法返回实际读取的字节数的原因。

contract for the InputStream.read method详细描述了这一点。

第二种方法将剥离新线。我不确定这是不是你想要的。

请注意,这两种方法都假设InputStream的字节代表使用计算机默认charset的字符。如果字符是从使用不同字符集编码它们的源发送的,则期望字符串中的字符被破坏。

答案 2 :(得分:0)

在第一种方法中,您已定义byte size as 32768。现在让我们考虑一下你file size is 97536 bytes。在(read= is.read(buffer))first time it will read 32768 bytes使用second time it will read again 32768 bytes但在(32768 + 32768 + 32000 = 97536)时使用third time it will read only 32000字节读取字节时到文件大小。 现在,索引32000以后的缓冲区包含早期数据,而您正在打印整个缓冲区。因此,这个数据是在最后一次循环之前填充的额外字节。

因此,您的第一种方法是不读取不完整的字节,而是打印额外的字节。

答案 3 :(得分:0)

new BufferedReader(new InputStreamReader(is))。lines()。collect(Collectors.joining(" \ n"));