将InputStream转换为Java / Scala对象

时间:2015-06-09 19:29:54

标签: java scala serialization

从InputStream读取时,如何将InputStream转换为java / scala对象?一个示例用例是,将CSV文件作为流接收并在运行中逐行解析CSV。

例如:我有

case class Row(v1: String, v2: String, v3: String)

和示例CSV文件的单行是(Andy,Morgan,Male)。现在假设我收到了这个CSV InputStream,这个CSV有数百万行,无法保存到内存中。是否可以将InputStream转换为上述case类,将其用于我的目的,丢弃此case类的实例并为整个流重复此过程。

一个模糊的例子是:

try( val inputstream = new FileInputStream("file.txt") ) {
  var data = inputstream.read();
  while(data != ???){
    ////// somehow convert/buffer the data and convert to Row class mentioned above
    data = inputstream.read();
  }
}

我想了解内部结构,所以我非常感谢原生java / scala中没有任何第三方库的解决方案。

1 个答案:

答案 0 :(得分:0)

实际上有一个名为ObjectInputStream的Java输入流,您可以将其用于将其作为类进行强制转换。

try{
    val fileInputStream = new FileInputStream("file.txt")
    val objectInputStream = new ObjectInputStream(fileInputStream)
    var data = objectInputStream.readObject.asInstanceOf[Row]
    while(data != ???){
        /*Do stuff here*/
        data = objectInputStream.readObject.asInstanceOf[Row]
    }
}catch{
     /*Catch cases*/
}

当然,这假设您的inputStream正在传输这些Row个对象,否则您必须以不同方式进行此操作。如果文件要大到适合内存开始,您可能需要考虑流式传输这些Row对象而不是在接收端执行此操作。

我做了,但是找到了这个class,它看起来相当多才多艺,有像这样的构造函数(以及其他许多):

CSVFileReader(File f) /*or*/ CSVFileReader(String filename, CSVFormat format)

有一种方法可以逐行阅读(readLine(),返回CSVLine),可以帮助您转换为Row对象。

希望这有帮助!