OpenCSV не может прочитать InputStream, созданный Jersey2

У меня есть следующий код:

    @POST
    @Path("/csv")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public String populateCSV(@FormDataParam("data") InputStream fileInputStream) throws   JsonParseException, JsonMappingException, IOException {
        ObjectMapper mapper = new ObjectMapper();
        File initialFile = new File("/Users/me/Downloads/file.csv");
        InputStream targetStream = FileUtils.openInputStream(initialFile);
        CSVReader reader = new CSVReader(new InputStreamReader(targetStream), ',', '"', 0);
        CSVReader jerseyReader = new CSVReader(new InputStreamReader(fileInputStream), ',', '"', 0);
        List<String[]> fileAllRows = reader.readAll();
        List<String[]> jerseyAllRows = jerseyReader.readAll();
        return null;
}

jerseyAllRows, созданный из CSVReader, который считывает преобразование файла Джерси в InputStream, возвращает пустые строки, а fileAllRows, созданный из FileInputStream, содержащего тот же файл, который отправляется в джерси, возвращает 3 строки.

Что заставляет то, как Джерси2 читает файл, создает другой InputStream?

Мне нужно опубликовать файл на Jersey2 и иметь возможность анализировать его с помощью OpenCSV.

ОТРЕДАКТИРОВАНО

Если я преобразую входной поток трикотажа в строку следующим образом:

InputStream is = new ByteArrayInputStream(IOUtils.toString(inputStream).getBytes());
reader = new CSVReader(new InputStreamReader(is), ',', '"', 0);

Я получаю линии. но это пустая трата памяти :( Есть идеи?


person Dejell    schedule 08.01.2015    source источник
comment
Вы получаете какую-либо ошибку?   -  person Dejan    schedule 10.01.2015
comment
нет. я не получаю никаких ошибок   -  person Dejell    schedule 10.01.2015


Ответы (1)


Во-первых, вы должны попробовать uniVocity-parsers парсер CSV, так как он в два раза быстрее и имеет много дополнительных функций. .

Second, вы должны указать кодировку вашего ввода.

В-третьих, вам также может потребоваться явно указать разделители строк.

Пример использования uniVocity-parsers:

File initialFile = new File("/Users/me/Downloads/file.csv");
InputStream targetStream = FileUtils.openInputStream(initialFile);

CsvParserSettings settings = new CsvParserSettings();
settings.getFormat().setLineSeparator("\n");

CsvParser parser = new CsvParser(settings);
List<String[]> allRows = parser.parseAll(new InputStreamReader(targetStream, "UTF-8"));

Раскрытие информации: я являюсь автором этой библиотеки. Это бесплатно и с открытым исходным кодом (лицензия Apache V2.0).

person Jeronimo Backes    schedule 10.01.2015
comment
здорово. это сработало! можно ли писать с этим парсером? Я хочу добавить к этому существующему файлу, который я читаю, еще один столбец - person Dejell; 11.01.2015
comment
Да, ты можешь! Просто используйте CsvWriter. Ознакомьтесь с руководством. - person Jeronimo Backes; 11.01.2015
comment
Спасибо. что такое outputWrite? Я пытался отправить ByteArrayOutputStream, но он не принял его. - person Dejell; 12.01.2015
comment
Просто предоставьте Writer:ByteArrayOutputStream csvResult = new ByteArrayOutputStream(); Модуль записи Writer = новый OutputStreamWriter (csvResult, UTF-8); CsvWriter csvWriter = новый CsvWriter (запись, настройки); - person Jeronimo Backes; 13.01.2015