FileInputStream用于通用文件系统

时间:2010-05-15 11:17:58

标签: java filesystems hdfs

我有一个包含java序列化对象的文件,例如“Vector”。我已将此文件存储在Hadoop分布式文件系统(HDFS)上。现在我打算在map任务中读取这个文件(使用方法readObject)。我想是

FileInputStream in = new FileInputStream("hdfs/path/to/file");

不会工作,因为文件存储在HDFS上。所以我想到了使用org.apache.hadoop.fs.FileSystem类。但不幸的是它没有任何返回FileInputStream的方法。它只有一个返回FSDataInputStream的方法,但我想要一个可以从文件中读取序列化java对象(如vector)的输入流,而不仅仅是FSDataInputStream可以执行的原始数据类型。

请帮忙!

2 个答案:

答案 0 :(得分:6)

FileInputStream并不能直接读取序列化对象。您需要将其包装到ObjectInputStream中。您可以使用FSDataInputStream执行相同操作,只需将其包装到ObjectInputStream中,然后就可以从中读取对象。

换句话说,如果您fileSystem类型为org.apache.hadoop.fs.FileSystem,请使用:

ObjectInputStream in = new ObjectInputStream(fileSystem.open(path));

答案 1 :(得分:-2)

您需要像这样转换FSDataInputStream(scala代码)

val hadoopConf = new org.apache.hadoop.conf.Configuration()
val hdfs = org.apache.hadoop.fs.FileSystem.get(new     java.net.URI("hdfs://nameserv"), hadoopConf)

val in = hdfs.open(new org.apache.hadoop.fs.Path("hdfs://nameserv/somepath/myfile")).asInstanceOf[java.io.InputStream]