读取文件中方的的第一个字符”T”,转换成字节数组,前三个字节就可以判断TXT的存储格式,具体实现代码如下:
// 读取文件
public List<String> readFileByLines(String fileName) {
List<String> list = new ArrayList<String>();
File file = new File(fileName);
BufferedReader reader = null;
InputStream inputStream = null;
try {
// 判断的文件输入流
inputStream = new FileInputStream(file);
byte[] head = new byte[3];
inputStream.read(head);
//判断TXT文件编码格式
if (head[0] == -1 && head[1] == -2 ){
//Unicode -1,-2,84
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"Unicode"));
}else if (head[0] == -2 && head[1] == -1 ){
//Unicode big endian -2,-1,0,84
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-16"));
}else if(head[0]==-17 && head[1]==-69 && head[2] ==-65) {
//UTF-8 -17,-69,-65,84
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
}else{
//ANSI 84 = T
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"gb2312"));
}
String tempString = null;
int line = 1;
while ((tempString = reader.readLine()) != null) {
list.add(tempString);
line++;
}
inputStream.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e1) {
}
}
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
}
return list;
}
注意点:作为判断的文件输入流,不能作为输入字节流的参数,因为在判断的时候已经读取过数据了,再次使用将相当于使用不同的编码进行了拆分,会造成乱码,因此需要重新构建文件输入流作为输入字节流的参数