错误情形及对策
以下是从共有“外部存储”获取txt类型文件的部分代码:
public static String getStringFromPubExternalFiles(String filePath){
BufferedInputStream bis = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
File file0 = Environment.getExternalStoragePublicDirectory("");
File file = new File(file0, "/"+filePath);
try {
bis = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[1024];
int c = 0;
while ((c = bis.read(buffer)) != -1) {
baos.write(buffer, 0, c);
baos.flush();
}
Log.d("公有外部存储获取字符串:", baos.toByteArray().toString());
...
return baos.toByteArray().toString();
}
as中运行,Log.d()打出的字符是:
D/公有外部存储获取字符串:: [B@a55c068
而不是想要的字符串。
网上查询有许多解决办法,但大多是2014年左右的方法,感觉这个问题在现在好像已经不是问题。其解决方法大多和编码有关系,但较复杂。心想:如果在临转字符串时加上转码要求(utf-8),岂不简单些,于是就不断测试,最终发现将以上部分代码作如下修改:
...
Log.d("公有外部存储获取字符串:", baos.toString("utf-8"));
...
return baos.toString("utf-8");
就输出正常了:
D/公有外部存储获取字符串:: 我爱你塞北的雪
后来又发现即使去掉括号中的“utf-8”也会正常输出,即
return baos.toString();
错误、对策分析
baos是ByteArrayOutputStream 的对象,其方法:baos.toByteArray().toString()是有问题的。ByteArrayOutputStream是字节数组的缓冲,其中已有字节数组,再转换成字节数组(baos.toByteArray()),好像有点多余,所以baos直接转字符串:baos.toString(),也过。可能baos的toString()方法中默认的转码格式是utf-8,所以toString()方法中不加“utf-8”也能正常输出。
baos.toByteArray().toString()能运行通过,结果却是乱码,大概是ByteArrayOutputStream中的一个小bug吧。