将InputStream转换为Java/Scala对象

将InputStream转换为Java/Scala对象,java,scala,serialization,Java,Scala,Serialization,从InputStream读取时,如何将InputStream转换为java/scala对象?一个示例用例是,以流的形式接收CSV文件,并动态地逐行解析CSV 例如:我有 case class Row(v1: String, v2: String, v3: String) 示例CSV文件的单行是(Andy、Morgan、Male)。现在假设我收到这个CSV输入流,这个CSV有数百万行,不能保存在内存中。是否可以将InputStream强制转换为上述case类,将其用于我的目的,放弃此case类的

从InputStream读取时,如何将InputStream转换为java/scala对象?一个示例用例是,以流的形式接收CSV文件,并动态地逐行解析CSV

例如:我有

case class Row(v1: String, v2: String, v3: String)
示例CSV文件的单行是(Andy、Morgan、Male)。现在假设我收到这个CSV输入流,这个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中没有任何第三方库的解决方案。

实际上有一个名为
ObjectInputStream
的java inputstream,您可以使用它作为类进行强制转换

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正在流式传输这些
对象,否则您必须以不同的方式进行处理。如果文件要大到适合内存中,你可能想考虑流这些“代码>行对象,而不是在接收端做这个。

然而,我确实发现了这一点,它似乎具有相当多的功能,有这样的构造函数(在许多其他构造函数中):

有一种逐行读入的方法(
readLine()
,它返回一个
CSVLine
),可以帮助您转换到
对象


希望这有帮助

我能知道为什么这被否决了吗?问题是否不够清楚和/或重复和/或作业?我不是反对者,但我认为你的问题中有一些不清楚的地方:1。InputStream已经是一个java\scala对象,转换它的目的是什么2。解析意味着从结构化文本创建数据对象。因此,文本是如何构造的,以及作为结果3,您需要什么样的数据对象。为什么这个任务需要任何初步的文件编写?正如你所看到的,我的评论比你的问题要长。更具描述性,请向我们提供一些您的代码~Odomontis我已经更新了一点问题。它是否仍然不完整/令人困惑?感谢您的输入。CSV文件的步骤很简单:1。读取字符而不是字节(因此使用读取器而不是输入流);2.一行接一行地读;3.对于每一行,将该行拆分为条目,并创建一个包含该行信息的Java对象,4。对对象做任何你想做的事情,5,读下一行并重复,直到到达文件的结尾。好吧,这不是重点。考虑我有一个Excel文件流,我可以通过Apache POI之类的东西来解析它。在这种情况下,我无法逐个字符读取文件。
CSVFileReader(File f) /*or*/ CSVFileReader(String filename, CSVFormat format)