如何反序列化CSV文件流?

时间:2012-11-26 05:15:13

标签: java csv deserialization

8年后我回到Java了。

我有一个文件上传HTML页面:

<form action="/upload" method="post" enctype="multipart/form-data">
  <input type="file" name="file" />
  <input type="submit" value="Upload" />
</form>

从我上传CSV文件。

/upload映射到实现doPost方法的servlet:

  ServletFileUpload upload = new ServletFileUpload();
  FileItemIterator iterator = upload.getItemIterator(req);

  while (iterator.hasNext()) {

    FileItemStream item = iterator.next();
    InputStream stream = item.openStream();

    if (!item.isFormField()) {
      int len;
      byte[] buffer = new byte[8192];
      while ((len = stream.read(buffer, 0, buffer.length)) != -1) {
        // do some deserialization here..?
      }
    }

  }

我真的希望有一种比手动解析方法更好的方法。我正在阅读Serializable界面 - 这是我可以使用的吗?

感谢。

2 个答案:

答案 0 :(得分:2)

我希望您已经根据代码查看了user guide for commons fileupload。

您可以轻松地将来自commons fileupload的输入流传递到CSV库(例如Super CSV),而不是编写自己的流读取代码。您甚至可以将CSV读作POJO(即Javabean)。看看examples

您的代码只会与您从InputStream而不是File中读取的示例不同,因此创建阅读器将类似于:

ICsvBeanReader beanReader = new CsvBeanReader(
    new InputStreamReader(stream), CsvPreference.STANDARD_PREFERENCE);

如果您实际上不想阅读CSV文件(例如,您可能希望保留它或通过电子邮件发送),那么您可以使用Commons IO的IOUtils将其读入字节数组。< / p>

byte[] bytes = IOUtils.toByteArray(stream);

哦,欢迎回到Java:)

答案 1 :(得分:1)

CSVReader库。

Serializable接口用于将对象的状态存储到字节流。可以把它想象成将一个游戏保存到一个保存文件(如果你升级你的版本然后尝试重新加载旧的保存,那么会有类似的代表)。