一张表里面的 blob字段的值,用流读出来,然后放到另外一张表里面的 blob字段里,怎么解决..
一张表里面的   blob字段的值,用流读出来,然后放到另外一张表里面的   blob字段里,怎么解决..
------解决方案--------------------摘自http://xigua.80s.net.cn/article.asp?id=58   
 setter: 
 利用PreparedStatement的setXXX方法,setBinaryStream()方法用于写入二进制流,与此相对应的ResultSet中getBinaryStream()用于取回. 
 对于文件本身,要把它作为一个流,只要new InputStream(new FileInputStream( "文件路径 ")) 
 就可以了,但对于大的String对象,你不会写入文件再转换成输入流吧? 
 new StringBufferInputStream(String s),记住了. 
 JDBC2以后提供了java.sql.BLOB对象,我不建议大家使用它,一是很麻烦,二是容易出错,要先插 
 入一个空的BLOB对象,然后再填充它,实在没有必要,直接setXXX就行了,我试过,至少mysql, 
 oracle,sql server是可以直接set的. 
 好了,我们先看一个例子如何写入文件到数据库: 
 数据结构: 
 create table test( 
 name varchar(200), 
 content BLOB 
 ); 
 File f = new File( "a.exe ");//先生成File对象是为了取得流的长度.FileInputStram可以直接 
 //传入文件路径 
 InputStream in = new InputStream(new FileInputStream(f)); 
 PreparedStatement ps = conn.prepareStatement( "insert into test (?,?) "); 
 ps.setString(1, "a.exe "); 
 ps.setBinaryStream(2,in,(int)f.length()); 
 ps.executeUpdate(); 
 f的长度一定要做从long到int的转换,SUN的文档中好几版都没有改过来.就这么简单,当然,不同的 
 数据库存本身要设置它允许的最大长度,MYSQL默认只能传1M的文件,要修改参数原能存更大的文件. 
 如果要从数库中取得文件: 
 PreparedStatement ps = conn.prepareStatement( "select * from test where name=? "); 
 ps.setString(1, "a.exe "); 
 ResultSet rs = ps.executeQuery(); 
 if(rs.next()){ 
 InputStream in = rs.getBinaryStream( "content "); 
 } 
 得到in对象后,你可以进行任何处理,写向文件和写向页面只是out对象不同而已: 
 写向文件: 
 DateOutputStream out = new DateOutputStream(new FileOutputStream( "b.exe ")); 
 写向页面: 
 response.reset(); 
 response.setContType( "类型 "); 
 ServletOutputSreamt out = response.getOutputSream(); 
 得到out对象后,就可以输出了: 
 byte[] buf = new byte[1024]; 
 int len = 0; 
 while((len = in.read(buf)) > 0) 
 out.write(buf,0,len); 
 in.close(); 
 out.close(); 
 对于向页面输入,要设置什么样的ContType,要看你想如何输出,如果你想让对方下载,就设为 
  "application/octet-stream ",这样即使是文本,图象都会下载而不会在浏览器中打开.如果你要想 
 在浏览器中打开,就要设置相应的类型,还要在容器的配置文件中设置支持这种文档类型的输出,但 
 对于很多格式的文件,到底要输出什么类型,其实就是HTTP的MIME集,比如图片:image/gif,当然你如 
 果你的文件扩展名(ext)不确定,你也不要用if(ext.equals( "gif "))......这样来判断,我教你一个 
 技巧,我之所以说是技巧,是我没有在别的地方发现有人用这种方法,对我来说我是绝对不会把别人的 
 方法拿来说是我的技巧的: 
 构造一个file类型的URL,我们知道URL目前JAVA可以支持HTTP,FTP,MAILTO,FILE,LDAP等,从FILE类型 
 的URL就可以得到它的MIME:   
 URL u = new URL( "file://a.exe "); 
 String mime = u.openConnection().getContentType(); 
 这样你就可以直接response.setContType(mime);而不用一个一个类型判断了. 
 好了,大对象存储就说到这儿,不同的数据仍然和些特殊的规定,不在此一一列举了