从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中没有任何第三方库的解决方案。
答案 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
对象。
希望这有帮助!