it-swarm.it

Controlla la riga per i caratteri non stampabili durante la lettura del file di testo

Il mio programma deve leggere file di testo riga per riga. File in UTF-8. Non sono sicuro che i file siano corretti - possono contenere caratteri non stampabili. È possibile verificarlo senza passare al livello di byte? Grazie.

48
user710818

Se si desidera verificare che una stringa contenga caratteri non stampabili, è possibile utilizzare un'espressione regolare

[^\p{Print}]
15
Peter Lawrey

Apri il file con un FileInputStream , quindi usa un InputStreamReader con l'UTF-8 Charset per leggere i caratteri dallo stream e utilizzare un BufferedReader per leggere le righe, ad es. attraverso BufferedReader#readLine , che ti darà una stringa. Una volta che hai la stringa, puoi verificare la presenza di caratteri che non sono quelli che ritieni siano stampabili.

Per esempio. (senza controllo degli errori), usando try-with-resources (che è vagamente moderno Java versione):

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

Anche se non è difficile farlo manualmente usando BufferedReader e InputStreamReader, userei Guava :

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

Puoi quindi fare quello che vuoi con quelle righe.

EDIT: Nota che questo leggerà l'intero file in memoria in una volta sola. Nella maggior parte dei casi va bene, ed è certamente più semplice che leggerlo riga per riga, elaborando ogni riga mentre la leggi. Se è un file enorme, potrebbe essere necessario farlo in questo modo secondo T.J. La risposta di Crowder.

49
Jon Skeet

Ho appena scoperto che con Java NIO (Java.nio.file.*) puoi facilmente scrivere:

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

invece di trattare con FileInputStreams e BufferedReaders ...

42
McIntosh

Che ne dici di seguito:

 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

11
xproph

Posso trovare i seguenti modi di fare.

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 risposta di @TJCrowder è Java 6 - in Java 7 la risposta valida è quella di @McIntosh - anche se il suo uso di Charset come nome per UTF -8 è scoraggiato:

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

Ricorda molto il modo Guava pubblicato da Skeet sopra - e ovviamente valgono gli stessi avvertimenti. Cioè, per file di grandi dimensioni (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

Se ogni carattere nel file è codificato correttamente in UTF-8, non avrai problemi a leggerlo usando un lettore con la codifica UTF-8. Spetta a te controllare ogni carattere del file e vedere se lo consideri stampabile o meno.

0
JB Nizet