Image processing 如何将Hadoop中的SequenceFile转换为图像文件?以下代码返回错误(bImageFromConvert为空)

Image processing 如何将Hadoop中的SequenceFile转换为图像文件?以下代码返回错误(bImageFromConvert为空),image-processing,hadoop,sequencefile,Image Processing,Hadoop,Sequencefile,/*将序列文件转换为图像 正在使用的序列文件是从图像生成的序列文件。png格式*/ import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.File; import javax.imageio.ImageIO; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSyste

/*将序列文件转换为图像 正在使用的序列文件是从图像生成的序列文件。png格式*/

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import javax.imageio.ImageIO;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.util.ReflectionUtils;



public class SeqToImage {
//序列文件的键是图像名称,值是图像内容

public static void main(String args[]) throws Exception {

        Configuration confHadoop = new Configuration();       
        FileSystem fs = FileSystem.get(confHadoop);
        Path inPath = new Path("/home/Desktop/1.seq");
        SequenceFile.Reader reader = new SequenceFile.Reader(fs, inPath, confHadoop);
        Writable key = (Writable)
        ReflectionUtils.newInstance(reader.getKeyClass(), confHadoop);
        Writable value = (Writable)
        ReflectionUtils.newInstance(reader.getValueClass(), confHadoop);
        reader.next(key,value);
//输出是一些字节数,这意味着b不是空的

  System.out.println("KEY "+key.toString());
            byte[] b = Bytes.toBytes(value.toString());
            System.out.println(b.length);
//由于bImageFromConvert为空,以下行返回错误

BufferedImage bImageFromConvert = ImageIO.read(new ByteArrayInputStream(b));
您的值(图像)应为BytesWritable。你应该像这样投:

System.out.println((bImageFromConvert.toString()).length());
        ImageIO.write(bImageFromConvert, "png", new File(
                "/home/Desktop/imageAgain.png"));
        }
    }
第二,您应该使用copyBytes()而不是Bytes.toBytes

它给出的字节副本正好是数据的长度。 所以这应该行得通

     BytesWritable value = (BytesWritable)
    ReflectionUtils.newInstance(reader.getValueClass(), confHadoop);

这将完成

序列文件中的实际键和值类型是什么?键类型是文本,值类型是BytesWritable如果使用getKeyClass方法,为什么需要使用强制转换?i、 e.
(IntWritable)reader.getKeyClass().newInstance()在我的示例中,它不是已经是可写的了吗?谢谢
    Configuration confHadoop = new Configuration();       
    FileSystem fs = FileSystem.get(confHadoop);
    Path inPath = new Path("/home/Desktop/1.seq");
    SequenceFile.Reader reader = new SequenceFile.Reader(fs, inPath, confHadoop);
    //Name of your Image
    Text key = (Text)
    ReflectionUtils.newInstance(reader.getKeyClass(), confHadoop);
    // Value -- mage
    BytesWritable value = (BytesWritable)
    ReflectionUtils.newInstance(reader.getValueClass(), confHadoop);
    reader.next(key,value);
    .......
                byte[] b = copyBytes(value) ;

    System.out.println((bImageFromConvert.toString()).length());
    ImageIO.write(bImageFromConvert, "png", new File(
            "/home/Desktop/imageAgain.png"));
    }
}