Как определить / обработать текстовые файлы новой строкой в ​​Java? - PullRequest
3 голосов
/ 11 июня 2010

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

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

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

Ответы [ 3 ]

5 голосов
/ 11 июня 2010

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

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

  • при чтении \ n, заканчивайте текущую строку и начинайте следующую строку
  • при чтении \ r, заканчивайтетекущая строка и, если следующий символ - \ n, пропустите его и начните следующую строку, в противном случае немедленно начинайте новую строку.
1 голос
/ 11 июня 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();
    }
1 голос
/ 11 июня 2010

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

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

...