[英]Reading InputStream into byte array and then converting to String problem
我从这段代码中得到以下日志消息,但我不确定为什么我没有在字符串中得到 output。 如果我转换不正确,有人可以建议吗? len
有一个值,所以我知道 InputStream 是好的。 location
也验证为好。
我正在阅读的文件大小为 42.7 KB。
FileServices fs = new FileServices("");
InputStream in = fs.getInputStreamFromVault(location);
int len;
String strFileContents = "";
logger.info(logPrefix + "file1 ");
BufferedInputStream inBuff = new BufferedInputStream(in);
logger.info(logPrefix + "file2 ");
byte[] buf = new byte[564000];
logger.info(logPrefix + "file3 ");
int bytesRead = 0;
while ((len = inBuff.read(buf)) > 0) {
logger.info(logPrefix + "file4 ");
logger.info("len " + len);
strFileContents += new String(buf, 0, bytesRead);
logger.info("bytesRead " + bytesRead);
//String string = new String(buf, "UTF-8");
//stream.write(buf, 0, len);
logger.info("strFileContents " + strFileContents);
}
登录 output
INFO : [prefix] file1
INFO : [prefix] file2
INFO : [prefix] file3
INFO : [prefix] file4
INFO : len 43681
INFO : bytesRead 0
INFO : strFileContents
此代码中的第一个问题是您从未向bytesRead
分配任何内容。
但是如果你解决了这个问题,你仍然从根本上以错误的方式读取文本文件,因为你试图以基本上任意的块手动将byte[]
解码为String
。 如果文本碰巧只在一个字节中只编码一个字符,那效果很好。 但是一旦使用宽编码(如UCS-2)或变长编码(如UTF-8和UTF-16),就很容易出错(会引入不必要的解码问题)。
从InputStream
读取文本的正确方法是将其包装在InputStreamReader
中:
InputStream in = fs.getInputStreamFromVault(location);
Reader inReader = new InputStreamReader(in, StandardCharsets.UTF_8);
StringBuilder contentBuilder = new StringBuilder();
char[] buf = new char[64*1024]; //arbitrary buffer size
int charsRead;
while ((charsRead = inReader.read(buf)) > 0) {
contentBuilder.append(buf, 0, charsRead);
}
String strFileContents = contentBuilder.toString();
logger.info("strFileContents " + strFileContents);
请注意,这还使用StringBuilder
代替了字符串连接,这对于这么小的文件可能无关紧要,但仍然是一个养成的好习惯,因为循环中的字符串连接不是一个好主意。
最后但同样重要的是,这也确保指定要使用的编码,而不是依赖于平台默认编码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.