/** * @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; 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; } } } bis.close(); } catch (Exception e) { log.info("获取文件编码异常"); } return charset; }
标签:JAVA,String,另存为,read,UTF8,bis,new,byte,first3Bytes From: https://www.cnblogs.com/guliang/p/16872383.html