Подтвердить что ты не робот

Проверка строки для непечатаемых символов при чтении текстового файла

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

4b9b3361

Ответ 1

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

[^\p{Print}]

Ответ 2

Откройте файл с 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
    }
}

Ответ 3

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

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

Затем вы можете делать все, что хотите, с этими строками.

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

Ответ 4

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

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

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

Ответ 5

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

 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

Ответ 6

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

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

Ответ 7

Ответ от @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 */ }

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

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

Ответ 8

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