【问题标题】:OpenCSV can't read InputStream created by Jersey2OpenCSV 无法读取 Jersey2 创建的 InputStream
【发布时间】:2015-01-08 09:58:05
【问题描述】:

我有以下代码:

    @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 创建的,它读取从 File 到 InputStream 的 Jersey 转换返回空行,而 fileAllRows 是由 FileInputStream 创建的,其中包含提交给球衣的相同文件, 返回 3 行。

是什么让 Jersey2 读取文件的方式创建了不同的 InputStream?

我需要将文件发布到 Jersey2 并能够使用 OpenCSV 对其进行解析

已编辑

如果我像这样将球衣输入流转换为字符串:

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

我确实有台词。但这是浪费内存:(有什么想法吗?

【问题讨论】:

  • 你有什么错误吗?
  • 没有。我没有收到任何错误

标签: java jersey jersey-2.0 opencsv


【解决方案1】:

首先,您应该尝试uniVocity-parsers CSV 解析器,因为它的速度是原来的两倍,并且具有许多附加功能。

其次,您应该提供输入的编码。

第三,您可能还需要明确指定行分隔符

使用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 许可)。

【讨论】:

  • 太棒了。这行得通!我可以用这个解析器写吗?我想添加到我正在阅读另一列的现有文件中
  • 是的,你可以!只需使用CsvWriter 类。检查tutorial
  • 谢谢。什么是输出写入?我试图发送一个 ByteArrayOutputStream 但它不接受它
  • 只提供一个Writer:ByteArrayOutputStream csvResult = new ByteArrayOutputStream(); Writer writer = new OutputStreamWriter(csvResult, "UTF-8"); CsvWriter csvWriter = new CsvWriter(writer, settings);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
  • 2018-10-24
相关资源
最近更新 更多