彻底解决android读取txt乱码终极方案
16lz
2021-01-23
解决android读取txt乱码
一,工具类FileUtil
/**
* 获取文件内容
*
* @param filePath
* @return
*/
public static String getFileOutputString(String filePath, String charset) {
try {
File file = new File(filePath);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), charset), 8192);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = bufferedReader.readLine()) != null) {
sb.append("\n").append(line);
}
bufferedReader.close();
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/** * 获取文件编码 * @param filePath * @return */public static String getCharset(String filePath) { BufferedInputStream bis = null; String charset = "GBK"; byte[] first3Bytes = new byte[3]; try { boolean checked = false; bis = new BufferedInputStream(new FileInputStream(filePath)); bis.mark(0); int read = bis.read(first3Bytes, 0, 3); if (read == -1) return charset; if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE) { charset = "UTF-16LE"; checked = true; } else if (first3Bytes[0] == (byte) 0xFE && first3Bytes[1] == (byte) 0xFF) { charset = "UTF-16BE"; checked = true; } else if (first3Bytes[0] == (byte) 0xEF && first3Bytes[1] == (byte) 0xBB && first3Bytes[2] == (byte) 0xBF) { charset = "UTF-8"; checked = true; } bis.mark(0); if (!checked) { while ((read = bis.read()) != -1) { if (read >= 0xF0) break; if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBK break; if (0xC0 <= read && read <= 0xDF) { read = bis.read(); if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF) // (0x80 - 0xBF),也可能在GB编码内 continue; else break; } else if (0xE0 <= read && read <= 0xEF) {// 也有可能出错,但是几率较小 read = bis.read(); if (0x80 <= read && read <= 0xBF) { read = bis.read(); if (0x80 <= read && read <= 0xBF) { charset = "UTF-8"; break; } else break; } else break; } } } } catch (Exception e) { e.printStackTrace(); } finally { if (bis != null) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } } return charset;}
二,使用方法
String charset = FileUtil.getCharset(file.getAbsolutePath()); String content = FileUtil.getFileOutputString(file.getAbsolutePath(),charset);
更多相关文章
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContent
- Android文件图片上传的详细讲解(四)---服务端编码
- Android学习笔记之mainfest文件中android属性 .
- 修改Android中Layout布局文件字体的大小
- Dealing with Asset Compression in Android Apps(避免asset目录