Comprobar línea para caracteres no imprimibles mientras lee el archivo de texto

Mi progtwig debe leer archivos de texto, línea por línea. Archivos en UTF-8. No estoy seguro de que los archivos sean correctos; pueden contener caracteres no imprimibles. ¿Es posible verificarlo sin pasar al nivel de bytes? Gracias.

Si desea verificar que una cadena tenga caracteres no imprimibles, puede usar una expresión regular

[^\p{Print}] 

Abra el archivo con un FileInputStream , luego use un InputStreamReader con el UTF-8 Charset para leer caracteres de la secuencia, y use un BufferedReader para leer líneas, por ejemplo, a través de BufferedReader#readLine , que le dará una cadena. Una vez que tenga la cadena, puede verificar si hay caracteres que no son lo que considera imprimibles.

Ej. (Sin verificación de errores), usando try-with-resources (que es una versión Java vagamente moderna):

 String line; try ( InputStream fis = new FileInputStream("the_file_name"); InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-8")); BufferedReader br = new BufferedReader(isr); ) { while ((line = br.readLine()) != null) { // Deal with the line } } 

Si bien no es difícil hacerlo manualmente usando BufferedReader y InputStreamReader , usaría Guava :

 List lines = Files.readLines(file, Charsets.UTF_8); 

A continuación, puede hacer lo que quiera con esas líneas.

EDITAR: Tenga en cuenta que esto leerá todo el archivo en la memoria de una vez. En la mayoría de los casos, eso está realmente bien, y ciertamente es más simple que leerlo línea por línea, procesando cada línea a medida que la lee. Si se trata de un archivo enorme, es posible que deba hacerlo de esa manera según la respuesta de TJ Crowder.

Acabo de descubrir que con Java NIO ( java.nio.file.* ) Puede escribir fácilmente:

 List lines=Files.readAllLines(Paths.get("/tmp/test.csv"), Charset.forName("UTF-8")); for(String line:lines){ System.out.println(line); } 

en lugar de tratar con FileInputStream s y BufferedReader s …

¿Qué tal a continuación?

  FileReader fileReader = new FileReader(new File("test.txt")); BufferedReader br = new BufferedReader(fileReader); String line = null; // if no more lines the readLine() returns null while ((line = br.readLine()) != null) { // reading lines until the end of the file } 

Fuente: http://devmain.blogspot.co.uk/2013/10/java-quick-way-to-read-or-write-to-file.html

Puedo encontrar las siguientes formas de hacerlo.

 private static final String fileName = "C:/Input.txt"; public static void main(String[] args) throws IOException { Stream lines = Files.lines(Paths.get(fileName)); lines.toArray(String[]::new); List readAllLines = Files.readAllLines(Paths.get(fileName)); readAllLines.forEach(s -> System.out.println(s)); File file = new File(fileName); Scanner scanner = new Scanner(file); while (scanner.hasNext()) { System.out.println(scanner.next()); } 

La respuesta de @TJCrowder es Java 6: en java 7, la respuesta válida es la de @McIntosh, aunque se desaconseja usar Charset para el nombre de UTF -8:

 List lines = Files.readAllLines(Paths.get("/tmp/test.csv"), StandardCharsets.UTF_8); for(String line: lines){ /* DO */ } 

Recuerda mucho sobre el camino de Guava publicado por Skeet arriba, y por supuesto se aplican las mismas advertencias. Es decir, para archivos grandes (Java 7):

 BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8); for (String line = reader.readLine(); line != null; line = reader.readLine()) {} 

Si cada carácter del archivo está codificado correctamente en UTF-8, no tendrá ningún problema para leerlo con un lector con la encoding UTF-8. Depende de usted comprobar cada carácter del archivo y ver si lo considera imprimible o no.