Запись в файл с Groovy (Grails) не удается для некоторых строк (ломаные линии) - PullRequest
3 голосов
/ 24 февраля 2011

Я выполняю некоторые массовые записи в файл .csv, используя Groovy. Точнее говоря, у меня запущено задание Quartz, и я создаю несколько сообщений Map, которые отправляются в очередь RabbitMQ. Очередь используется 10 потребителями, и в результате получается несколько списков строк. Для каждого элемента в Списке я просто записываю его в файл .csv, разделенный конвейером. Фактическая служба, у которой есть метод, который записывает в файл .csv, является стандартной (одноэлементной) транзакционной службой grails. Когда я записываю строки для записи, все нормально, но в файле некоторые строки «разбиты». Я пишу так:

def writeRowsToFile(List<String> rows, File file) {
  rows.each {row->
    file.append("${row}\n")
  }
}

Изначально я использовал:

file.withWriterAppend {out->
  out.write(row.toString())
  out.newLine()
}

и получил тоже самое ...

Если бы это было что-то не так, он потерпел бы неудачу для всех строк. Может ли это быть какое-то состояние гонки, параллелизм или я не знаю, что еще проблема?

Любая помощь будет оценена.

Спасибо

1 Ответ

3 голосов
/ 24 февраля 2011

Вы должны сделать это вторым способом, то есть:

def writeRowsToFile(List<String> rows, File file) {
  file.withWriterAppend {out->
    rows.eachWithIndex { row, idx ->

      // It's probably \n chars in your strings
      if( row ==~ /.*[\n\r]+.*/ ) {
        println "Detected a CRLF char in rows[$idx]"
      }

      out.writeLine row
    }
  }
}

Однако вы говорите, что это может быть «какое-то состояние гонки»

Записывают ли несколько потоков в один и тот же файл?

Если нет, то более вероятно, что ваши row данные содержат \n символов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...