我尝试了两种差异方法从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有什么问题吗?
答案 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"));