Проверить строку на наличие непечатных символов при чтении текстового файла - PullRequest
48 голосов
/ 14 сентября 2011

Моя программа должна читать текстовые файлы - построчно.Файлы в UTF-8.Я не уверен, что файлы правильные - могут содержать непечатные символы.Возможна ли проверка на это без перехода на уровень байтов?Спасибо.

Ответы [ 8 ]

121 голосов
/ 14 сентября 2011

Откройте файл с помощью FileInputStream, затем используйте InputStreamReader с UTF-8 Charset для чтения символов из потока и используйте BufferedReader для чтения строк, например через BufferedReader#readLine, что даст вам строку. Получив строку, вы можете проверить наличие символов, которые не считаются печатными.

например. (без проверки ошибок), используя try-with-resources (что является смутно современной версией Java):

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
    }
}
49 голосов
/ 14 сентября 2011

Хотя это не сложно сделать вручную, используя BufferedReader и InputStreamReader, я бы использовал Гуава :

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

После этого вы можете делать все что угоднолинии.

РЕДАКТИРОВАТЬ: Обратите внимание, что это будет читать весь файл в память за один раз.В большинстве случаев это на самом деле хорошо - и, безусловно, на 1010 * проще , чем читать его построчно, обрабатывая каждую строку по мере ее чтения.Если это огромный файл, вам может потребоваться сделать это так, как указано в ответе TJ Crowder.

42 голосов
/ 11 октября 2012

Только что обнаружил, что с Java NIO (java.nio.file.*) вы можете легко написать:

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

вместо того, чтобы иметь дело с FileInputStream s и BufferedReader s ...

15 голосов
/ 14 сентября 2011

Если вы хотите проверить, что строка содержит непечатаемые символы, вы можете использовать регулярное выражение

[^\p{Print}]
11 голосов
/ 21 октября 2013

Как насчет ниже:

 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

 }

Источник: http://devmain.blogspot.co.uk/2013/10/java-quick-way-to-read-or-write-to-file.html

5 голосов
/ 15 апреля 2016

Я могу найти следующие способы сделать.

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());
    }
3 голосов
/ 17 июня 2014

Ответ @ T.J.Crowder - Java 6 - в Java 7 правильный ответ - @McIntosh - хотя использование Charset в качестве имени для UTF -8 не рекомендуется:

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

Напоминает многое о пути гуавы, опубликованном Скитом выше - и, конечно, применяются те же предостережения. То есть для больших файлов (Java 7):

BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8);
for (String line = reader.readLine(); line != null; line = reader.readLine()) {}
1 голос
/ 14 сентября 2011

Если каждый символ в файле правильно закодирован в UTF-8, у вас не возникнет проблем при его чтении с использованием устройства чтения с кодировкой UTF-8.До вас, чтобы проверить каждый символ файла и посмотреть, считаете ли вы его для печати или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...