javablob,javablob字段 轉字符串oracle

本文目錄一覽:

使用java語言操作,如何來實現MySQL中Blob字段的存取

/**

* Title: BlobPros.java

* Project: test

* Description: 把圖片存入mysql中的blob字段,並取出

* Call Module: mtools數據庫中的tmp表

* File: C:downloadsluozsh.jpg

* Copyright: Copyright (c) 2003-2003

* Company: uniware

* Create Date: 2002.12.5

* @Author: ChenQH

* @version 1.0 版本*

*

* Revision history

* Name Date Description

* —- —- ———–

* Chenqh 2003.12.5 對圖片進行存取

*

* note: 要把數據庫中的Blob字段設為longblob

*

*/

//package com.uniware;

import java.io.*;

import java.util.*;

import java.sql.*;

public class BlobPros

{

private static final String URL = “jdbc:mysql://10.144.123.63:3306/mtools?user=windpassword=123useUnicode=true”;

private Connection conn = null;

private PreparedStatement pstmt = null;

private ResultSet rs = null;

private File file = null;

public BlobPros()

{

}

/**

* 向數據庫中插入一個新的BLOB對象(圖片)

* @param infile 要輸入的數據文件

* @throws java.lang.Exception

*/

public void blobInsert(String infile) throws Exception

{

FileInputStream fis = null;

try

{

Class.forName(“org.gjt.mm.mysql.Driver”).newInstance();

conn = DriverManager.getConnection(URL);

file = new File(infile);

fis = new FileInputStream(file);

//InputStream fis = new FileInputStream(infile);

pstmt = conn.prepareStatement(“insert into tmp(descs,pic) values(?,?)”);

pstmt.setString(1,file.getName()); //把傳過來的第一個參數設為文件名

//pstmt.setBinaryStream(2,fis,(int)file.length()); //這種方法原理上會丟數據,因為file.length()返回的是long型

pstmt.setBinaryStream(2,fis,fis.available()); //第二個參數為文件的內容

pstmt.executeUpdate();

}

catch(Exception ex)

{

System.out.println(“[blobInsert error : ]” + ex.toString());

}

finally

{

//關閉所打開的對像//

pstmt.close();

fis.close();

conn.close();

}

}

/**

* 從數據庫中讀出BLOB對象

* @param outfile 輸出的數據文件

* @param picID 要取的圖片在數據庫中的ID

* @throws java.lang.Exception

*/

public void blobRead(String outfile,int picID) throws Exception

{

FileOutputStream fos = null;

InputStream is = null;

byte[] Buffer = new byte[4096];

try

{

Class.forName(“org.gjt.mm.mysql.Driver”).newInstance();

conn = DriverManager.getConnection(URL);

pstmt = conn.prepareStatement(“select pic from tmp where id=?”);

pstmt.setInt(1,picID); //傳入要取的圖片的ID

rs = pstmt.executeQuery();

rs.next();

file = new File(outfile);

if(!file.exists())

{

file.createNewFile(); //如果文件不存在,則創建

}

fos = new FileOutputStream(file);

is = rs.getBinaryStream(“pic”);

int size = 0;

/* while(size != -1)

{

size = is.read(Buffer); //從數據庫中一段一段的讀出數據

//System.out.println(size);

if(size != -1) //-1表示讀到了文件末

fos.write(Buffer,0,size);

} */

while((size = is.read(Buffer)) != -1)

{

//System.out.println(size);

fos.write(Buffer,0,size);

}

}

catch(Exception e)

{

System.out.println(“[OutPutFile error : ]” + e.getMessage());

}

finally

{

//關閉用到的資源

fos.close();

rs.close();

pstmt.close();

conn.close();

}

}

public static void main(String[] args)

{

try

{

BlobPros blob = new BlobPros();

//blob.blobInsert(“C:Downloadsluozsh1.jpg”);

blob.blobRead(“c:/downloads/1.jpg”,47);

}

catch(Exception e)

{

System.out.println(“[Main func error: ]” + e.getMessage());

}

}

}

blob字段java如何處理

1.使用jdk中的方法進行傳輸。在ResultSet 中有getBlob()方法,在PreparedStatement中有setBlob()方法,所以大多數人都會嘗試setBlob

(),getBlob() 進行讀寫,或者兩個數據庫之間BLOB的傳輸。這種方法實際上是行不通的,據網上的一些資料介紹,說sun官方的文檔有些方法

都是錯誤的。

2.使用ResultSet.getBinaryStream 和PreparedStatement.setBinaryStream對BLOB進行讀寫或兩個數據庫間的傳輸。這種方法我自己嘗試過,

發現,如果BLOB中存儲的是文本文件的話,就沒問題,如果是二進制文件,傳輸就會有問題。

根據自己的經驗,以及查閱了Oracle的官方文檔,都是使用如下處理方法:

1.新建記錄,插入BLOB數據

 1.1首先新建記錄的時候,使用oracle的函數插入一個空的BLOB,假設字段A是BLOB類型的:

  insert xxxtable(A,B,C) values(empty_blob(),’xxx’,’yyyy’)

 1.2後面再查詢剛才插入的記錄,然後更新BLOB,在查詢前,注意設置Connection的一個屬性:

  conn.setAutoCommit(false);如果缺少這一步,可能導致fetch out of sequence等異常.

 1.3 查詢剛才插入的記錄,後面要加「 for update 」,如下:

  select A from xxxtable where xxx=999 for update ,如果缺少for update,可能出現row containing the LOB value is not locked

的異常

 1.4 從查詢到的 BLOB字段中,獲取blob並進行更新,代碼如下:

  BLOB blob = (BLOB) rs.getBlob(“A”);

  OutputStream os = blob.getBinaryOutputStream();

  BufferedOutputStream output = new BufferedOutputStream(os);

後面再使用output.write方法將需要寫入的內容寫到output中就可以了。例如我們將一個文件寫入這個字段中:

  BufferedInputStream input = new BufferedInputStream(new File(“c://hpWave.log”).toURL().openStream());

  byte[] buff = new byte[2048];  //用做文件寫入的緩衝

  int bytesRead;

  while(-1 != (bytesRead = input.read(buff, 0, buff.length))) {

   output.write(buff, 0, bytesRead);

   System.out.println(bytesRead);

  }

  上面的代碼就是從input里2k地讀取,然後寫入到output中。

 1.5上面執行完畢後,記得關閉output,input,以及關閉查詢到的ResultSet

 1.6最後執行conn.commit();將更新的內容提交,以及執行conn.setAutoCommit(true); 改回Connction的屬性

2.修改記錄,方法與上面的方法類似,

 2.1首先更新BLOB以外的其他字段

 2.2 使用1.3中類似的方法獲取記錄

 2.3 修改的過程中,注意以下:a 需要更新的記錄中,BLOB有可能為NULL,這樣在執行blob.getBinaryOutputStream()獲取的值可能為

null,那麼就關閉剛才select的記錄,再執行一次update xxxtable set A = empty_blob() where xxx, 這樣就先寫入了一個空的BLOB(不是null),然後再

使用1.3,1.4中的方法執行更新記錄.b 注意別忘了先執行setAutoCommit(false),以及”for update”,以及後面的conn.commit();等。

3.讀取BLOB字段中的數據.

 3.1 讀取記錄不需要setAutoCommit(),以及 select ….for update.

 3.2 使用普通的select 方法查詢出記錄

 3.3 從ResultSet中獲取BLOB並讀取,如下:

  BLOB b_to = (BLOB) rs.getBlob(“A”);

  InputStream is = b_from.getBinaryStream();

  BufferedInputStream input = new BufferedInputStream(is);

  byte[] buff = new byte[2048];

  while(-1 != (bytesRead = input.read(buff, 0, buff.length))) {

   //在這裡執行寫入,如寫入到文件的BufferedOutputStream里

   System.out.println(bytesRead);

  }

  通過循環取出blob中的數據,寫到buff里,再將buff的內容寫入到需要的地方

4.兩個數據庫間blob字段的傳輸

類似上面1和3的方法,一邊獲取BufferedOutputStream,另外一邊獲取BufferedInputStream,然後讀出寫入,需要注意的是寫入所用的

Connection要執行conn.setAutoCommit(false);以及獲取記錄時添加「 for update 」以及最後的commit();

總結以上方法,其根本就是先創建空的BLOB,再獲取其BufferedOutputStream進行寫入,或獲取BufferedInputStream進行讀取

(1)對數據庫clob型執行插入操作 

************************************************* 

 

java.sql.PreparedStatement pstmt = null; 

ResultSet rs = null; 

String query = “”; 

 

conn.setAutoCommit(false); 

 query = “insert into clobtest_table(id,picstr) values(?,empty_clob())”; 

java.sql.PreparedStatement pstmt = conn.prepareStatement(query); 

pstmt.setString(1,”001″); 

pstmt.executeUpdate(); 

pstmt = null 

 query = “select picstr from clobtest_table where id = ‘001’ for update”; 

pstmt = con.prepareStatement(query) 

rs= pstmt.executeQuery(); 

 

oracle.sql.CLOB clobtt = null; 

if(rs.next()){ 

 clobtt = (oracle.sql.CLOB)rs.getClob(1); 

Writer wr = clobtt.getCharacterOutputStream(); 

wr.write(strtmp); 

wr.flush(); 

wr.close(); 

rs.close(); 

con.commit(); 

 

 

 

(2)通過sql/plus查詢是否已經成功插入數據庫 

************************************************* 

 

PL/SQL的包DBMS_LOB來處理LOB數據。察看剛才的插入是否成功。使用DBMS_LOB包的getlength這個procedure來檢測是否已經將str存入到picstr字段中了。如: 

 

SQL select dbms_lob.getlength(picstr) from clobtest_table; 

 

 

(3)對數據庫clob型執行讀取操作 

************************************************* 

 

讀取相對插入就很簡單了。基本步驟和一半的取數據庫數據沒有太大的差別。 

String description = “” 

 query = “select picstr from clobtest_table where id = ‘001’”; 

pstmt = con.prepareStatement(query); 

ResultSet result = pstmt.executeQuery(); 

if(result.next()){ 

 oracle.jdbc.driver.OracleResultSet ors = 

 (oracle.jdbc.driver.OracleResultSet)result; 

 oracle.sql.CLOB clobtmp = (oracle.sql.CLOB) ors.getClob(1); 

 

 if(clobtmp==null || clobtmp.length()==0){ 

 System.out.println(“======CLOB對象為空 “); 

 description = “”; 

 }else{ 

 description=clobtmp.getSubString((long)1,(int)clobtmp.length()); 

 System.out.println(“======字符串形式 “+description); 

 } 

}

java中blob類型是什麼類型

blob是數據庫二進制對象的類型,圖片,文本之類的.

java沒有特定類,非要說的話,就是個超大的位元組數組~

java 字符串如何轉換流存入blob字段中

將字符串轉換成byte數組String.getBytes(),然後放進一個ByteArrayInputStream輸入流中即可存入BLOB字段中

PreparedStatement.setBlob(int

parameterIndex,

InputStream

inputStream)

java里怎麼判斷Blob類型是否為空

要看寫的Blob類型是什麼

是不是只的boolean類型還是聲明為Boolean的類

jdk1.4情況下

java里有基本類型的boolean和Boolean的包裝類。兩者是有區別的。至於什麼區別,我想樓主應該多看看書。

Blooean的聲明的變量是引用類型。這個引用將指向一個對象。該對象可以為空。例如:

Boolean b = null;

System.out.println(b);

打印的結果是 null;

當然如果聲明為基本類型,打印結果默認是false的,例如:

boolean b ;

System.out.println(b);

打印的結果是false

jdk5.0的情況沒做測試結果不清楚。估計結果和上面是一樣的。

但是因為在jdk5.0的情況下包裝類對象和基本類型似乎可以互相直接轉化例如:

int i = new Integer(5);

這種語句在1.4情況下編譯不過的,似乎5.0就可以。所以5.0以後的情況不確定

java blob

java blob是什麼,讓我們一起了解一下?

Blob是計算機視覺圖像中的一塊連通區域,Blob分析的就是對前景或背景分離後的二值圖像,進行連通域提取和標記以及計算Blob的一些相關特徵,而且通過Blob提取,還可以獲得相關區域的信息。

Blob分析的重要一個步驟是連通區域的確定,那麼它的優缺點是什麼?

優點:

Blob在目標跟蹤的優勢有:

1、通過Blob提取,可以獲得相關區域的信息,這些信息可以作為邊緣監測器或者角點檢測器的補充信息。在目標識別中,Blob可以提供局部的統計信息和外貌信息,這些信息能夠為目標識別和跟蹤提供依據。

2、可以利用Blob對直方圖進行峰值檢測。

3、Blob還可以作為紋理分析和紋理識別的基元。

4、通過Blob分析,可以得到目標的個數及其所在區域,在進行目標匹配時,不需要對全局圖像進行搜索。

缺點:

1、速度過慢,要整個區域作逐點掃描。

2、Blob分析難度大。這是一純幾何學上的問題,一個不規則的形狀,如何計算它的面積、大小沒有簡單易行的算法,太過複雜,運算時間就長,速度就更慢了。

3、實際應用。Blob算法在實際應用中,非常依賴光源。幾乎可以說,Blob算法如果離開了一個可靠的光源設計,則完全不起作用。

那麼java是怎樣對Blob讀寫的?示例如下:

package com.you.sister;   import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.sql.Blob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Properties;   public class BlobTest {   public static Connection conn; public static Connection getConn() throws Exception { FileInputStream fis = new FileInputStream(new File(“jdbc.properties”)); Properties prop = new Properties(); prop.load(fis); String driver = prop.getProperty(“jdbc.driver”); String url = prop.getProperty(“jdbc.url”); String username = prop.getProperty(“jdbc.username”); String password = prop.getProperty(“jdbc.password”); Class.forName(driver); return  DriverManager.getConnection(url, username, password); } public static void main(String[] args) throws Exception { conn = getConn(); readBlob(); writeBlob(); conn.close(); } /** * 從數據庫中讀大對象出來 * 保存在本地 */ public static void readBlob() { try { String readSql = “select * from emp where empno = ?”; PreparedStatement ps = conn.prepareStatement(readSql); ps.setInt(1, 7369); ResultSet rs = ps.executeQuery(); while (rs.next()) { Blob image = rs.getBlob(“image”); DataOutputStream dos =  // 在FileOutputStream中指定文件輸出路徑 new DataOutputStream(new FileOutputStream(7369 + “_image.jpeg”)); InputStream fis = image.getBinaryStream(); int out; byte[] outByte = new byte [100]; // 將blob對象輸入流寫入本地輸出流中 while ((out = fis.read(outByte)) != -1) { dos.write(outByte); } fis.close(); dos.flush(); dos.close(); } rs.close(); ps.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 將大對象文件保存進數據庫中 */ public static void writeBlob() { try { BufferedInputStream fis =  new BufferedInputStream(new FileInputStream(new File(“D:\\Tulips.jpg”))); // 如果是新插入字段,則將大對象對應字段插入為empty_clob(); // 如果是修改,則可以先update 該行數據,將大對象對應字段設置為empty_clob(); String writeSql = “select * from emp where empno = ? for update”; PreparedStatement ps = conn.prepareStatement(writeSql); ps.setInt(1, 7499); conn.setAutoCommit(false); ResultSet rs = ps.executeQuery(); while (rs.next()) { oracle.sql.BLOB image = (oracle.sql.BLOB)rs.getBlob(“image”); BufferedOutputStream bos = new BufferedOutputStream(image.getBinaryOutputStream()); int c; // 將實際文件中的內容以二進制的形式來輸出到blob對象對應的輸出流中 while ((c = fis.read()) != -1) { bos.write(c); } fis.close(); bos.close(); } conn.commit(); rs.close(); ps.close(); } catch (Exception e) { e.printStackTrace(); } } }

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/285714.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-22 16:06
下一篇 2024-12-22 16:06

相關推薦

  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Python中將字符串轉化為浮點數

    本文將介紹在Python中將字符串轉化為浮點數的常用方法。在介紹方法之前,我們先來思考一下這個問題應該如何解決。 一、eval函數 在Python中,最簡單、最常用的將字符串轉化為…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • Python學習筆記:去除字符串最後一個字符的方法

    本文將從多個方面詳細闡述如何通過Python去除字符串最後一個字符,包括使用切片、pop()、刪除、替換等方法來實現。 一、字符串切片 在Python中,可以通過字符串切片的方式來…

    編程 2025-04-29
  • 如何將Oracle索引變成另一個表?

    如果你需要將一個Oracle索引導入到另一個表中,可以按照以下步驟來完成這個過程。 一、創建目標表 首先,需要在數據庫中創建一個新的表格,用來存放索引數據。可以通過以下代碼創建一個…

    編程 2025-04-29
  • Python如何將字符串1234變成數字1234

    Python作為一種廣泛使用的編程語言,對於數字和字符串的處理提供了很多便捷的方式。如何將字符串「1234」轉化成數字「1234」呢?下面將從多個方面詳細闡述Python如何將字符…

    編程 2025-04-29
  • Python int轉二進制字符串

    本文將從以下幾個方面對Python中將int類型轉換為二進制字符串進行詳細闡述: 一、int類型和二進制字符串的定義 在Python中,int類型表示整數,二進制字符串則是由0和1…

    編程 2025-04-29
  • 用title和capitalize美觀處理Python字符串

    在Python中,字符串是最常用的數據類型之一。對字符串的美觀處理是我們在實際開發中經常需要的任務之一。Python內置了一些方法,如title和capitalize,可以幫助我們…

    編程 2025-04-28
  • Python 提取字符串中的電話號碼

    Python 是一種高級的、面向對象的編程語言,它具有簡單易學、開發迅速、代碼簡潔等特點,廣泛應用於 Web 開發、數據科學、人工智能等領域。在 Python 中,提取字符串中的電…

    編程 2025-04-28
  • Python如何打印帶雙引號的字符串

    Python作為一種廣泛使用的編程語言,在日常開發中經常需要打印帶雙引號的字符串。那麼,如何打印帶雙引號的字符串呢? 一、使用轉義字符 在Python中,我們可以通過使用轉義字符\…

    編程 2025-04-28

發表回復

登錄後才能評論