Как определить/обработать новые строки текстового файла в Java?

Я получаю файлы в разных форматах из разных систем, которые мне нужно импортировать в нашу базу данных. Частью процесса импорта является проверка длины строки, чтобы убедиться, что формат правильный. Похоже, у нас возникли проблемы с файлами, поступающими из систем UNIX, в которых добавлен один символ. Я подозреваю, что это связано с тем, что обратная каретка кодируется по-разному на платформах UNIX и Windows.

Есть ли способ определить, в какой файловой системе был создан файл, кроме проверки последнего символа в строке? Или, может быть, способ чтения файлов в виде текста, а не двоичного кода, который, как я подозреваю, является проблемой?

Спасибо ребята !


person rafrafUk    schedule 11.06.2010    source источник
comment
Некоторые символы, такие как знак британского фунта £, в кодировке UTF8 занимают два байта. Как вы измеряете длину? Каков целевой набор символов в БД?   -  person pjp    schedule 11.06.2010
comment
Название и тег (файловые системы) вводят в заблуждение.   -  person aioobe    schedule 11.06.2010


Ответы (3)


Системы Unix используют окончания строки \n, в то время как Windows использует \r\n, а Mac использует \r. Вы не можете определить файловую систему, так как это вообще не имеет значения. Я могу использовать \n в Windows, если, например, мой редактор поддерживает это. Это просто стандарт для этих ОС, а не требование.

Правильный способ - при условии, что у вас нет функции, которая правильно токенизирует независимо от того, какую строку в конце файла использует - это поиск \n ИЛИ a \r , а затем конец текущей строки и удаление всех символов из оставшихся данных, которые являются либо \r, либо \n, прежде чем вы начнете следующую строку. Однако это вызовет проблемы, если у вас есть пустые строки и вам нужно их сохранить. В этом случае вам нужно более внимательно смотреть на разрывы строк:

  • при чтении \n закончить текущую строку и начать следующую строку
  • при чтении \r закончить текущую строку и, если следующий символ \n, пропустить его и начать следующую строку, в противном случае немедленно начать новую строку.
person ThiefMaster    schedule 11.06.2010
comment
Классическая Mac OS использовала \r для обозначения конца строки. Текущие версии Mac OS (в основном все, что было выпущено за последние 10 лет) используют \n - person Goibniu; 11.06.2010

Большую часть времени Java будет автоматически обрабатывать различные типы окончаний строк, молча анализируя \n (unix), \r\n (windows) и \r (mac), не беспокоя вас (пока вы используете поток символов). См. документы для java.io.FileReader и друзей. Использование потока символов также будет обрабатывать все возможные схемы кодирования Unicode.

Если вы хотите явно прочитать разделители строк, вам нужно прочитать файл как поток байтов. См. документы для java.io.DataInputStream и друзей.

person Craig Trader    schedule 11.06.2010

Есть ли способ определить, в какой файловой системе был создан файл, кроме проверки последнего символа в строке?

Нет. И даже проверка последовательности завершения строки — это только подсказка. Мы можем легко создавать файлы с окончанием строки DOS в UNIX и наоборот.

Или, может быть, способ чтения файлов в виде текста, а не двоичного кода, который, как я подозреваю, является проблемой?

Да. Откройте файл с помощью программы чтения файлов, заверните его в буферизованную программу чтения и используйте readLine() для чтения файла построчно. Этот метод распознает "\n", "\r" или "\r\n" в качестве разделителя строк и, следовательно, работает для файлов DOS, UNIX и Mac.

Вот типичный код:

    Reader r = new FileReader("somefile");
    try {
        BufferedReader br = new BufferedReader(r);
        String line;
        while ((line = r.readLine()) != null) {
            // process line
        }
    } finally {
        r.close();
    }
person Stephen C    schedule 11.06.2010