去除bom

https://blog.csdn.net/qq_28430851/article/details/80899294

import java.io.*;

import java.util.ArrayList;

import java.util.List;

/**

* utf-8有bom 批量转为 utf-8无bom 文件格式

*/

public class UTF8BOMConverter extends Reader {

private static final int BOM_SIZE = 4;

PushbackInputStream internalIn;//回退流对象

InputStreamReader internalIn2 = null;

String defaultEnc;//格式

/**

* @param in         inputstream to be read

* @param defaultEnc default encoding if stream does not have

*                   BOM marker. Give NULL to use system-level default.

*/

UTF8BOMConverter(InputStream in, String defaultEnc) {

internalIn = new PushbackInputStream(in, BOM_SIZE);

this.defaultEnc = defaultEnc;

}

private static void readContentAndSaveWithEncoding(String filePath, String readEncoding, String saveEncoding) throws Exception {

saveContent(filePath, readContent(filePath, readEncoding), saveEncoding);

}

private static void saveContent(String filePath, String content, String encoding) throws Exception {

FileOutputStream fos = new FileOutputStream(filePath);

OutputStreamWriter w = new OutputStreamWriter(fos, encoding);

w.write(content);

w.flush();

}

private static String readContent(String filePath, String encoding) throws Exception {

FileInputStream file = new FileInputStream(new File(filePath));

BufferedReader br = new BufferedReader(new UTF8BOMConverter(file, encoding));

String line = null;

String fileContent = "";

while ((line = br.readLine()) != null) {

fileContent = fileContent + line;

fileContent += "\r\n";

}

return fileContent;

}

private static List<String> getPerlineFileName(String filePath) throws Exception {

FileInputStream file = new FileInputStream(new File(filePath));

BufferedReader br = new BufferedReader(new InputStreamReader(file, "UTF-8"));

String line = null;

List<String> list = new ArrayList<String>();

while ((line = br.readLine()) != null) {

list.add(line);

}

return list;

}

/**

* 获取某个目录下所有的文件路径

* 使用递归

* @param filePath

* @param filePaths

* @return

*/

private static List<String> getAllFilePaths(File filePath, List<String> filePaths) {

File[] files = filePath.listFiles();

if (files == null) {

return filePaths;

}

for (File f : files) {

if (f.isDirectory()) {

filePaths.add(f.getPath());

getAllFilePaths(f, filePaths);

} else {

filePaths.add(f.getPath());

}

}

return filePaths;

}

public static void main(String[] args) throws Exception {

String suffix = ".java";

List<String> paths = new ArrayList<String>();

paths = getAllFilePaths(new File("D:/work/idea_coding/HJMJX/HJMJX/core/src/main/java"), paths);

List<String> pathList = new ArrayList<String>();

for (String path : paths) {

if (path.endsWith(suffix)) {

pathList.add(path);

}

}

for (String path : pathList) {

readContentAndSaveWithEncoding(path, "UTF-8", "UTF-8");

System.out.println(path + "转换成功");

}

}

public String getDefaultEncoding() {

return defaultEnc;

}

/**

* Get stream encoding or NULL if stream is uninitialized.

* Call init() or read() method to initialize it.

*/

public String getEncoding() {

if (internalIn2 == null) return null;

return internalIn2.getEncoding();

}

/**

* Read-ahead four bytes and check for BOM marks. Extra bytes are

* unread back to the stream, only BOM bytes are skipped.

*/

protected void init() throws IOException {

if (internalIn2 != null) return;

String encoding;

byte bom[] = new byte[BOM_SIZE];

int n, unread;

n = internalIn.read(bom, 0, bom.length);

if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00) &&

(bom[2] == (byte) 0xFE) && (bom[3] == (byte) 0xFF)) {

encoding = "UTF-32BE";

unread = n - 4;

} else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE) &&

(bom[2] == (byte) 0x00) && (bom[3] == (byte) 0x00)) {

encoding = "UTF-32LE";

unread = n - 4;

} else if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB) &&

(bom[2] == (byte) 0xBF)) {

encoding = "UTF-8";

unread = n - 3;

} else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) {

encoding = "UTF-16BE";

unread = n - 2;

} else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) {

encoding = "UTF-16LE";

unread = n - 2;

} else {

// Unicode BOM mark not found, unread all bytes

encoding = defaultEnc;

unread = n;

}

//System.out.println("read=" + n + ", unread=" + unread);

if (unread > 0) internalIn.unread(bom, (n - unread), unread);

// Use given encoding

if (encoding == null) {

internalIn2 = new InputStreamReader(internalIn);

} else {

internalIn2 = new InputStreamReader(internalIn, encoding);

}

}

public void close() throws IOException {

init();

internalIn2.close();

}

public int read(char[] cbuf, int off, int len) throws IOException {

init();

return internalIn2.read(cbuf, off, len);

}

}

(0)

相关推荐