web-dev-qa-db-fra.com

Ligne de contrôle pour les caractères non imprimables lors de la lecture du fichier texte

Mon programme doit lire les fichiers texte - ligne par ligne. Fichiers en UTF-8. Je ne suis pas sûr que les fichiers soient corrects - peuvent contenir des caractères non imprimables. Est-il possible de le vérifier sans passer au niveau octet? Merci.

48
user710818

Si vous voulez vérifier qu'une chaîne contient des caractères non imprimables, vous pouvez utiliser une expression régulière

[^\p{Print}]
15
Peter Lawrey

Ouvrez le fichier avec un FileInputStream , puis utilisez un InputStreamReader avec l'UTF-8 Charset pour lire les caractères du flux et utiliser un BufferedReader pour lire les lignes, par exemple via BufferedReader#readLine , qui vous donnera une chaîne. Une fois que vous avez la chaîne, vous pouvez rechercher des caractères qui ne sont pas ce que vous considérez comme imprimables.

Par exemple. (sans vérification d'erreur), en utilisant try-with-resources (qui est vaguement moderne Java version)):

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
    }
}
121
T.J. Crowder

Bien que ce ne soit pas difficile à faire manuellement en utilisant BufferedReader et InputStreamReader, je voudrais utiliser Guava :

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

Vous pouvez ensuite faire ce que vous voulez avec ces lignes.

EDIT: Notez que ceci lira l’ensemble du fichier en mémoire en une fois. Dans la plupart des cas, c'est très bien - et il est certainement plus simple que de le lire ligne par ligne, en traitant chaque ligne au fur et à mesure que vous le lisez. Si le fichier est énorme, vous devrez peut-être le faire de la manière indiquée dans T.J. La réponse de Crowder.

49
Jon Skeet

Je viens de découvrir que avec le Java NIO (Java.nio.file.*) vous pouvez facilement écrire:

List<String> lines=Files.readAllLines(Paths.get("/tmp/test.csv"), StandardCharsets.UTF_8);
for(String line:lines){
  System.out.println(line);
}

au lieu de traiter avec FileInputStreams et BufferedReaders ...

42
McIntosh

Que diriez-vous ci-dessous:

 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

 }

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

11
xproph

Je peux trouver les moyens suivants pour faire.

private static final String fileName = "C:/Input.txt";

public static void main(String[] args) throws IOException {
    Stream<String> lines = Files.lines(Paths.get(fileName));
    lines.toArray(String[]::new);

    List<String> 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());
    }
5
Kumar Abhishek

La réponse de @TJCrowder est Java 6 - in Java 7 la réponse valide est celle de @McIntosh - bien que son utilisation du jeu de caractères comme nom pour UTF -8 est découragé:

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

Cela rappelle beaucoup la façon Goyave signalée par Skeet ci-dessus - et bien sûr, les mêmes mises en garde s'appliquent. C'est-à-dire pour les gros fichiers (Java 7):

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

Si tous les caractères du fichier sont correctement encodés en UTF-8, vous n’aurez aucun problème à les lire à l’aide d’un lecteur doté de l’encodage UTF-8. A vous de vérifier chaque caractère du fichier et de voir si vous le considérez comme imprimable ou non.

0
JB Nizet