最近由于需要做数据迁移,用到了kettle这个工具,由于api不多,开发过程非常艰难,最终也算是做出来了,以下贴上代码
具体流程很短,如上图所示,将数据库中数据查出来后使用java脚本将blob转换成文件流输出,java脚本代码如下
import javax.imageio.ImageIO;
import java.io.*;
import java.sql.Blob;
import java.sql.SQLException;
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
Object[] r = getRow();
if (r == null) {
setOutputDone();
return false;
}
try {
String stationid = get(Fields.In, "STATIONID").getString(r);
output(getBytes(r,"STATIONPHOTO"),"sp"+stationid,"jpg");
output(getBytes(r,"STATIONREPORT"),"sr"+stationid,"doc");
output(getBytes(r,"STATIONPNTMAP"),"sm"+stationid,"jpg");
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
public byte[] getBytes(Object[] r,String name) throws Exception{
return (byte[])get(Fields.In, name).getObject(r);
}
public void output(byte[] input,String filename,String type) throws Exception{
if(input!=null && input.length>0){
File w2 = new File("F:/picture/"+filename+"."+type);//可以是jpg,png,gif格式
FileOutputStream imageOutput = new FileOutputStream(w2);//打开输入流
imageOutput.write(input, 0, input.length);//将byte写入硬盘
imageOutput.close();
}
}
以上遇到的问题是转成string再转成16进制的byte数组时应该是格式损坏,导致无法正常转换成文件,所以在取出来的时候用object接收强转成byte数组完美解决