Различия линий между Windows и Linux?
Я пытаюсь разобрать файл linux/etc/passwd в java. В настоящее время я читаю каждую строку через класс сканера в java, а затем используя string.split(), чтобы разграничить каждую строку.
Проблема заключается в том, что строка "list: x: 38: 38: Менеджер списка рассылки:/var/list:/bin/sh" обрабатывается сканером как 3 разные строки: 1) "list: x: 38: 38: Mailing" 2) "List" 3) "Менеджер..." Когда я ввожу это в новый файл, который я не получил из linux, сканер разбирает его правильно.
Есть ли что-то, что я не понимаю о новых строках в Linux?
Очевидно, что работа вокруг заключается в том, чтобы анализировать ее без использования сканера, но это было бы не изящно. Кто-нибудь знает об элегантном способе сделать это?
Есть ли способ конвертировать файл в файл, который будет работать со Сканером?
Пожалуйста, дайте мне знать.
Спасибо,
JBU
Не прошло и двух дней назад: Исторический аргумент за разную линию, заканчивающуюся на разных платформах
ИЗМЕНИТЬ
Примечание от автора:
"Я понял, что у меня другая ошибка, которая вызывает проблему. Не обращайте внимания на вопрос"
Ответы
Ответ 1
От Wikipedia:
- LF: Multics, Unix и Unix-подобные системы (GNU/ Linux, AIX, Xenix, Mac OS X, FreeBSD и т.д.), BeOS, Amiga, RISC OS и другие.
- CR + LF: DEC RT-11 и большинство других ранних не-Unix-систем, отличных от IBM, CP/M, MP/M, DOS, OS/2, Microsoft Windows, Symbian OS
- CR: Commodore, семейство Apple II, Mac OS до версии 9 и OS-9
Я перевешу это в эти строки в целом:
- Windows:
'\r\n'
- Mac (OS 9-):
'\r'
- Mac (OS 10+):
'\n'
- Unix/Linux:
'\n'
Вам нужно сделать ваш сканер/парсер обрабатывать версию unix.
Ответ 2
Вы можете получить стандартную строку, заканчивающуюся для текущей ОС:
System.getProperty("line.separator")
Ответ 3
Сканер разбивается на пробелы.
РЕДАКТИРОВАТЬ. "Сканирование" Java-учебник гласит:
По умолчанию сканер использует пробелы для разделения токенов. (Символы пробела включают пробелы, вкладки и терминаторы строк. Полный список см. В документации для Character.isWhitespace.)
Вы можете использовать метод useDelimiter() для изменения этих значений по умолчанию.
Ответ 4
Это работает для меня на Ubuntu
import java.util.Scanner;
import java.io.File;
public class test {
public static void main(String[] args) {
try {
Scanner sc = new Scanner(new File("/etc/passwd"));
String l;
while( ( l = sc.nextLine() ) != null ) {
String[] p = l.split(":");
for(String pi: p) System.out.print( pi + "\t:\t" );
System.out.println();
}
} catch(Exception e) { e.printStackTrace(); }
}
}
Ответ 5
Вы пытались удалить все скрытые символы, но "\n". Какое регулярное выражение используется для разделения строк?
Ответ 6
Почему бы не использовать LineNumberReader
?
Если вы не можете сделать это, как выглядит код?
Единственное различие, о котором я могу думать, это то, что вы раскалываетесь на плохое регулярное выражение и что, когда вы сами редактируете файл, вы получаете dos newlines, которые каким-то образом передают ваше регулярное выражение.
Тем не менее, для чтения вещей по одной строке за раз, кажется, что overkill использует Scanner
.
Конечно, почему вы разбираете /etc/passwd
- это еще одно обсуждение:)
Ответ 7
Теперь я помню, почему я использую BufferedReader в этих случаях...: -)