Я думаю, что происходит следующее
Все строки, содержащие ^L (ff), изменяются, чтобы удалить все до ^L, но, кроме того, у вас есть побочный эффект в 1, который также удаляет все \r (cr). Однако, если cr появляется перед ^L nextLine(), это также рассматривается как строка. Обратите внимание, как в выходном файле ниже количество cr + nl равно 6 во входном файле, а количество cr + nl также равно 6, но все они nl, поэтому строка с c сохраняется, потому что она обрабатывается на строка, отличная от ^L. Вероятно, это не то, что вы хотите. Смотри ниже.
Некоторые наблюдения
Исходный файл создается в системе, которая использует \r\n для определения новой строки, а ваша программа запускается в системе, которая этого не делает. Из-за этого все вхождения 0xd будут удалены. Это сделает два файла разных размеров, даже если нет ^L.
Но вы, вероятно, упустили из виду № 1, потому что vim будет работать в режиме DOS (распознает \r\n как разделитель новой строки) или в не-DOS-режиме (только \n) в зависимости от того, что он читает при открытии файла и скрывает этот факт от пользователя. пользователь, если это возможно. На самом деле, чтобы проверить, мне пришлось использовать грубую силу в \r, используя ^v^m, потому что я редактировал в Linux, используя vim подробнее здесь.
Ваши средства для тестирования, вероятно, используют od -x (для шестнадцатеричного права)? Но это выводит целые числа, а это не то, что вам нужно. Рассмотрим следующий входной файл и выходной файл. После запуска вашей программы. Как показано в vi
Входной файл
a
b^M
c^M^M ^L
d^L
Выходной файл
a
b
c
Ну, может быть, это правильно, давайте посмотрим, что скажет од
od -x входного файла
0a61 0d62 630a 0d0d 0c20 640a 0a0c
od -x выходного файла
0a61 0a62 0a63 0a0a 000a
А откуда взялся этот ноль? Но подождите от man-страницы od
-t type Specify the output format. type is a string containing one or more of the following kinds of type specifiers:
q a Named characters (ASCII). Control characters are displayed using the following names:
-h, -x Output hexadecimal shorts. Equivalent to -t x2.
-a Output named characters. Equivalent to -t a.
О, хорошо, вместо этого используйте опцию -a
od -a ввода
a nl b cr nl c cr cr sp ff nl d ff nl
od -a вывода
a nl b nl c nl nl nl nl
Заставить java игнорировать \r
И, наконец, все, что было сказано, вам действительно нужно преодолеть неявное понимание java, что \r разделяет строку, даже вопреки документации. Даже при явной настройке сканера на использование шаблона игнорирования \r он по-прежнему работает вопреки документации, и вы должны переопределить это снова, установив разделитель (см. ниже). Я обнаружил, что следующее, вероятно, сделает то, что вы хотите, настаивая на семантике строк Unix. Я также добавил некоторую логику, чтобы не выводить пустую строку.
public static void repl(File original,File file) throws IOException
{
Scanner fileScanner = new Scanner(original);
Pattern pattern1 = Pattern.compile("(?d).*");
fileScanner.useDelimiter("(?d)\\n");
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF8"));
while(fileScanner.hasNext(pattern1))
{
String next = fileScanner.next(pattern1);
next = next.replaceAll("(?d)(.*\\x0C)|(\\x0D)","");
if(next.length() != 0)
{
out.write(next);
out.newLine();
}
}
out.flush();
out.close();
}
С этим изменением вывод выше изменится на.
od -a ввода
a nl b cr nl c cr cr sp ff nl d ff nl
od -a вывода
a nl b nl
person
waTeim
schedule
24.03.2014
replaceAll
? - person 5gon12eder   schedule 23.03.2014