java jdbc(三)应用实例--向数据库中存储,读取图片和文件
2016-04-12 16:28
861 查看
1.向数据库存储图片
通过PreparedStatement接口的setBinaryStream()方法,将二进制信息设置为parameterIndex。setBinaryStream method: 1) public void setBinaryStream(int paramIndex,InputStream stream) throws SQLException 2) public void setBinaryStream(int paramIndex,InputStream stream,long length) throws SQLException
为了保存图片到数据库,需要用到BLOB (Binary Large Object)类型,如下:
CREATE TABLE "IMGTABLE" ( "NAME" VARCHAR2(4000), "PHOTO" BLOB )
使用实例如下:
PreparedStatement ps=con.prepareStatement("insert into imgtable values(?,?)"); ps.setString(1,"sonoo"); FileInputStream fin=new FileInputStream("d:\\upload.jpg"); ps.setBinaryStream(2,fin,fin.available()); int i=ps.executeUpdate(); System.out.println(i+" records affected");
这里的fin.available()方法是估算二进制的大小,以避免二进制信息输入过程中阻塞其他方法的调用。
2.从数据库中读取图片
同样通过PreparedStatement接口来取回图片,我们使用getBlob()方法来获取Blob实例,它是一个二进制信息。我们接着调用getBytes()方法在blob对象上,可以获得二进制信息的一个数组,这可以让我们来写成图片文件。public Blob getBlob()throws SQLException public byte[] getBytes(long pos, int length)throws SQLException
现在我们继续用上面的IMGTABLE表来取回图片,并将它展示出来。在AWT中,它可以通过Toolkit类展示。在servlet, jsp, 或 html,它可以通过img标签展示。
PreparedStatement ps=con.prepareStatement("select * from imgtable"); ResultSet rs=ps.executeQuery(); if(rs.next()){//此时在第一行 Blob b=rs.getBlob(2);//2意思是第二行数据,即photo byte barr[]=b.getBytes(1,(int)b.length());//1意思是第一张图片 FileOutputStream fout=new FileOutputStream("d:\\download.jpg"); fout.write(barr); fout.close(); //记得关闭
3.保存文件到数据库
依然使用PreparedStatement接口来执行,这下你知道PreparedStatement的强大了吧。PreparedStatement接口的setCharacterStream()可以将字符信息设置为parameterIndex。
1) public void setBinaryStream(int paramIndex,InputStream stream)throws SQLException 2) public void setBinaryStream(int paramIndex,InputStream stream,long length)throws SQLException
为了保存文件类型在数据库,需要用到CLOB (Character Large Object)类型,如下:
CREATE TABLE "FILETABLE" ( "ID" NUMBER, "NAME" CLOB )
使用实例:
PreparedStatement ps=con.prepareStatement( "insert into filetable values(?,?)"); File f=new File("d:\\myfile.txt"); FileReader fr=new FileReader(f); ps.setInt(1,101); ps.setCharacterStream(2,fr,(int)f.length()); int i=ps.executeUpdate(); System.out.println(i+" records affected");
4.从数据库中读取文件
通过PreparedStatement接口的getClob()方法获取文件信息,接着通过Clob调用getCharacterStream(),获取字符流,这可以让我们写成文件public Clob getClob(int columnIndex){} public Reader getCharacterStream(long pos,long length) throws SQLException
使用上面的FILETABLE表获取文件,代码如下:
PreparedStatement ps=con.prepareStatement("select * from filetable"); ResultSet rs=ps.executeQuery(); rs.next();//此时指向第一行 Clob c=rs.getClob(2); Reader r=c.getCharacterStream(); FileWriter fw=new FileWriter("d:\\retrivefile.txt"); int i; while((i=r.read())!=-1) fw.write((char)i); fw.close(); con.close(); System.out.println("success"); }catch (Exception e) {e.printStackTrace(); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android之获取手机上的图片和视频缩略图thumbnails
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序