txt texto por modificar linea leer ejemplos como caracter archivos archivo java file-io utf-8 character-encoding windows-1252

modificar - leer un archivo de texto en java linea por linea



¿Cómo leer un archivo en Java con codificación de caracteres específicos? (3)

Con Java 7+, puedes crear el Reader en una línea:

BufferedReader buffReader = Files.newBufferedReader(Paths.get(fileName), getCorrectCharsetToApply());

Estoy tratando de leer un archivo como UTF-8 o Windows-1252 dependiendo de la salida de este método:

public Charset getCorrectCharsetToApply() { // Returns a Charset for either UTF-8 or Windows-1252. }

Hasta ahora, tengo:

String fileName = getFileNameToReadFromUserInput(); InputStream is = new ByteArrayInputStream(fileName.getBytes()); InputStreamReader isr = new InputStreamReader(is, getCorrectCharsetToApply()); BufferedReader buffReader = new BufferedReader(isr);

El problema que tengo es convertir la instancia de BufferedReader en un FileReader .

Además:

  • No se puede confiar en que el nombre del archivo en sí mismo (nombre de archivo) sea un conjunto de caracteres en particular; en algún momento el nombre del archivo contendrá caracteres UTF-8, y algunas veces Windows-1252. Lo mismo ocurre con el contenido del archivo (sin embargo, si el nombre del archivo y el contenido del archivo siempre tendrán conjuntos de caracteres coincidentes).
  • Solo la lógica dentro de getCorrectCharsetToApply() puede seleccionar el conjunto de caracteres que se aplicará, por lo que tratar de leer un archivo por su nombre antes de llamar a este método, Java podría intentar leer el nombre del archivo con la codificación incorrecta ... lo que causa a morir!

¡Gracias por adelantado!


Entonces, primero, como un aviso, fileName.getBytes() que fileName.getBytes() tal como está allí obtiene los bytes del nombre del archivo, no el archivo en sí.

Segundo, leyendo dentro de los documentos de FileReader :

Los constructores de esta clase asumen que la codificación de caracteres predeterminada y el tamaño predeterminado del byte-buffer son apropiados. Para especificar estos valores, construya un InputStreamReader en un FileInputStream.

Entonces, suena como FileReader en realidad no es el camino a seguir. Si tomamos los consejos de los documentos, debe cambiar su código para que tenga:

String fileName = getFileNameToReadFromUserInput(); FileInputStream is = new FileInputStream(fileName); InputStreamReader isr = new InputStreamReader(is, getCorrectCharsetToApply()); BufferedReader buffReader = new BufferedReader(isr);

y no tratar de hacer un FileReader en absoluto.


Tenga en cuenta que si está utilizando Google Guava , puede usar Files.newReader :

final BufferedReader reader = Files.newReader(new File(filename), getCorrectCharsetToApply());