繁体   English   中英

将InputStream读入byte数组再转成String问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM