Realmente no sé mucho sobre las operaciones de IO. . . También tengo pocos conocimientos de codificación y caracteres confusos. . . Hoy me encontré con el requisito de convertir la codificación de un archivo y devolver una cadena codificada, como la codificación GBK original, convertida a UTF-8.
Entre ellos, la clase BytesEncodingDetect no se publicará. Se utiliza principalmente para obtener el formato de codificación del archivo.
Primero intenté modificar el método de codificación directamente en el archivo fuente y usar URLEncoder y URLDecoder para la conversión, pero aún así no funcionó. El último carácter de un número impar en chino está confuso.
Baidu buscó una solución, pero fracasó, por lo que tuvieron que adoptar mi idea: primero leer el contenido del archivo fuente, almacenarlo en StringBuffer, luego eliminar el archivo fuente, luego crear un nuevo archivo y luego almacenarlo en otro. forma de codificación.
Ver el efecto después de la codificación: tenga cuidado de no ver el efecto en eclipse. Eclipse solo lo ve en forma de codificación, por lo que puede ver los archivos html en el lado del navegador para ver la codificación especificada, puede hacer clic derecho. codificación para determinar si tiene éxito.
Copie el código de código de la siguiente manera:
paquete com.test;
importar java.io.BufferedReader;
importar java.io.BufferedWriter;
importar java.io.File;
importar java.io.FileInputStream;
importar java.io.FileOutputStream;
importar java.io.InputStream;
importar java.io.InputStreamReader;
importar java.io.OutputStream;
importar java.io.OutputStreamWriter;
importar java.net.URLDecoder;
importar java.net.URLEncoder;
Transcodificación de clase pública {
codificación BytesEncodingDetect privada = nueva BytesEncodingDetect();
Transcodificación pública() {
}
/**
* Conversión de código
* @param toCharset La codificación a convertir
* @param path La ruta del archivo a convertir
* @devolver
* @throwsException
*/
La codificación de cadena pública (cadena a conjunto de caracteres, ruta de cadena) arroja una excepción {
Archivo srcFile = nuevo archivo (ruta);
int index = codificar.detectEncoding(srcFile);
Conjunto de caracteres de cadena = BytesEncodingDetect.javaname[índice];
// La codificación es la misma, no es necesario transcodificar
si (charset.equalsIgnoreCase(toCharset)) {
return "La codificación es la misma, no se necesita conversión";
}
InputStream en = nuevo FileInputStream(ruta);
BufferedReader br = nuevo BufferedReader (
nuevo InputStreamReader(en, juego de caracteres));
StringBuffer sb = nuevo StringBuffer();
Cadena s1;
mientras ((s1=br.readLine())!=null) {
Cadena s = URLEncoder.encode(s1, toCharset);
sb.append(s+"/r/n");//Una línea + retorno de carro
}
br.cerrar();
srcFile.delete();//Eliminar el archivo original
//Reescribe el archivo con la nueva codificación y devuelve el valor
Archivo nuevo archivo = nuevo archivo (ruta); // Reconstruir el archivo original
nuevoarchivo.createNewFile();
OutputStream out = nuevo FileOutputStream(nuevoarchivo);
Escritor OutputStreamWriter = nuevo OutputStreamWriter(out, toCharset);
BufferedWriter bw = nuevo BufferedWriter(escritor);
bw.write(URLDecoder.decode(sb.toString(), toCharset));
Resultado de cadena = URLDecoder.decode(sb.toString(), toCharset);
bw.flush();//Flash en el archivo
bw.cerrar();
resultado de devolución;
}
}