Verifique a linha de caracteres não imprimíveis ao ler o arquivo de texto

Meu programa deve ler arquivos de texto – linha por linha. Arquivos em UTF-8. Não tenho certeza de que os arquivos estão corretos – podem conter caracteres não imprimíveis. É possível verificar isso sem ir ao nível de byte? Obrigado.

Se você quiser verificar se uma string tem caracteres não imprimíveis, você pode usar uma expressão regular

[^\p{Print}] 

Abra o arquivo com um FileInputStream e use um InputStreamReader com o UTF-8 Charset para ler caracteres do stream e use um BufferedReader para ler linhas, por exemplo, por meio do BufferedReader#readLine , que fornecerá uma string. Depois de ter a string, você pode verificar os caracteres que não são o que você considera imprimíveis.

Por exemplo (sem verificação de erros), usando try-with-resources (que é na versão 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 } } 

Embora não seja difícil fazer isso manualmente usando BufferedReader e InputStreamReader , eu usaria o Guava :

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

Você pode então fazer o que quiser com essas linhas.

EDIT: Observe que isso lerá todo o arquivo na memory de uma só vez. Na maioria dos casos, isso é realmente bom – e certamente é mais simples do que ler linha por linha, processando cada linha à medida que você a lê. Se for um arquivo enorme, talvez seja necessário fazer isso de acordo com a resposta de TJ Crowder.

Acabei de descobrir que com o Java NIO ( java.nio.file.* ) Você pode escrever facilmente:

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

em vez de lidar com FileInputStream s e BufferedReader s …

Como sobre abaixo:

  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 } 

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

Eu posso encontrar as seguintes maneiras de fazer.

 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()); } 

A resposta de @TJCrowder é Java 6 – no java 7 a resposta válida é a de @McIntosh – embora seu uso de Charset para nome para UTF -8 seja desencorajado:

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

Lembra muito do modo Guava postado pelo Skeet acima – e, claro, as mesmas advertências se aplicam. Isto é, para arquivos grandes (Java 7):

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

Se todos os caracteres no arquivo estiverem codificados adequadamente em UTF-8, você não terá nenhum problema em lê-lo usando um leitor com a codificação UTF-8. Até você para verificar cada caractere do arquivo e ver se você o considera imprimível ou não.