JAVA将文件另存为UTF8格式

/**
     * @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;
}
  

  

posted @ 2022-11-09 08:42  bug毁灭者  阅读(650)  评论(0编辑  收藏  举报