/**
* @description: 将文本文件另存为UTF8格式
* @author: bug
* @date: 2022/11/8 19:22
* @param file
* @param srcFilePath
* @return java.lang.String
*/
private String saveAsUtf8(MultipartFile file, String srcFilePath) throws Exception{
InputStream inputStream = file.getInputStream();
String fileName = UUIDUtil.uuid32() + ".txt";
File tempFile = new File(srcFilePath);
if (!tempFile.exists()) {
tempFile.mkdirs();
}
String srcFileName = tempFile.getPath() + File.separator + fileName;
String inputFileEncode = this.getFileCharset(inputStream);
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(file.getInputStream(), inputFileEncode));
BufferedWriter bufferedWriter = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(srcFileName), "UTF8"));
String line;
while ((line = bufferedReader.readLine()) != null) {
bufferedWriter.write(line + "\n");
}
bufferedWriter.close();
bufferedReader.close();
return fileName;
}
/**
* @description: 获取文件的编码
* @author: bug
* @date: 2022/11/8 19:19
* @param fileInputStream
* @return java.lang.String
*/
private String getFileCharset(InputStream fileInputStream) {
String charset = "GBK";
byte[] first3Bytes = new byte[3];
try {
boolean checked = false;
//BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceFile));
BufferedInputStream bis = new BufferedInputStream(fileInputStream);
bis.mark(0);
int read = bis.read(first3Bytes, 0, 3);
if (read == -1) {
return charset; // 文件编码为 ANSI
} else if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE) {
charset = "UTF-16LE"; // 文件编码为 Unicode
checked = true;
} else if (first3Bytes[0] == (byte) 0xFE && first3Bytes[1] == (byte) 0xFF) {
charset = "UTF-16BE"; // 文件编码为 Unicode big endian
checked = true;
} else if (first3Bytes[0] == (byte) 0xEF && first3Bytes[1] == (byte) 0xBB
&& first3Bytes[2] == (byte) 0xBF) {
charset = "UTF-8"; // 文件编码为 UTF-8
checked = true;
}
bis.reset();
if (!checked) {
int loc = 0;
while ((read = bis.read()) != -1) {
loc++;
if (read >= 0xF0) {
break;
}
// 单独出现BF以下的,也算是GBK
if (0x80 <= read && read <= 0xBF) {
break;
}
// 双字节 (0xC0 - 0xDF)
// (0x80-0xBF),也可能在GB编码内
if (0xC0 <= read && read <= 0xDF) {
read = bis.read();
if (0x80 <= read && read <= 0xBF) {
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;
}
}
}
}
bis.close();
} catch (Exception e) {
log.info("获取文件编码异常");
}
return charset;
}