Различия линий между 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 в этих случаях...: -)