'Blob: JDBC deals with Binary Data'에 해당되는 글 1건

  1. 2010.02.19 Blob: JDBC deals with Binary Data
반응형
/*

Database Programming with JDBC and Java, Second Edition

By George Reese
ISBN: 1-56592-616-1

Publisher: O'Reilly

*/


import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * Example 4.2.
 */
public class Blobs {
  public static void main(String args[]) {
    if (args.length != 1) {
      System.err.println("Syntax: <java Blobs [driver] [url] "
          + "[uid] [pass] [file]");
      return;
    }
    try {
      Class.forName(args[0]).newInstance();
      Connection con = DriverManager.getConnection(args[1], args[2],
          args[3]);
      File f = new File(args[4]);
      PreparedStatement stmt;

      if (!f.exists()) {
        // if the file does not exist
        // retrieve it from the database and write it to the named file
        ResultSet rs;

        stmt = con.prepareStatement("SELECT blobData "
            + "FROM BlobTest " + "WHERE fileName = ?");

        stmt.setString(1, args[0]);
        rs = stmt.executeQuery();
        if (!rs.next()) {
          System.out.println("No such file stored.");
        } else {
          Blob b = rs.getBlob(1);
          BufferedOutputStream os;

          os = new BufferedOutputStream(new FileOutputStream(f));
          os.write(b.getBytes(0, (int) b.length()), 0, (int) b
              .length());
          os.flush();
          os.close();
        }
      } else {
        // otherwise read it and save it to the database
        FileInputStream fis = new FileInputStream(f);
        byte[] tmp = new byte[1024];
        byte[] data = null;
        int sz, len = 0;

        while ((sz = fis.read(tmp)) != -1) {
          if (data == null) {
            len = sz;
            data = tmp;
          } else {
            byte[] narr;
            int nlen;

            nlen = len + sz;
            narr = new byte[nlen];
            System.arraycopy(data, 0, narr, 0, len);
            System.arraycopy(tmp, 0, narr, len, sz);
            data = narr;
            len = nlen;
          }
        }
        if (len != data.length) {
          byte[] narr = new byte[len];

          System.arraycopy(data, 0, narr, 0, len);
          data = narr;
        }
        stmt = con.prepareStatement("INSERT INTO BlobTest(fileName, "
            + "blobData) VALUES(?, ?)");
        stmt.setString(1, args[0]);
        stmt.setObject(2, data);
        stmt.executeUpdate();
        f.delete();
      }
      con.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

           

Posted by 1010