从共有“外部存储”获取txt类型文件时出现乱码

错误情形及对策
以下是从共有“外部存储”获取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吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值