導航:首頁 > 編程語言 > java保存blob

java保存blob

發布時間:2022-12-31 18:06:07

『壹』 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.PreparedStatementpstmt=null;
ResultSetrs=null;
Stringquery="";

conn.setAutoCommit(false);
query="insertintoclobtest_table(id,picstr)values(?,empty_clob())";
java.sql.PreparedStatementpstmt=conn.prepareStatement(query);
pstmt.setString(1,"001");
pstmt.executeUpdate();
pstmt=null
query="selectpicstrfromclobtest_tablewhereid='001'forupdate";
pstmt=con.prepareStatement(query)
rs=pstmt.executeQuery();

oracle.sql.CLOBclobtt=null;
if(rs.next()){
clobtt=(oracle.sql.CLOB)rs.getClob(1);
}
Writerwr=clobtt.getCharacterOutputStream();
wr.write(strtmp);
wr.flush();
wr.close();
rs.close();
con.commit();(2)通過sql/plus查詢是否已經成功插入資料庫
*************************************************

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

SQL>selectdbms_lob.getlength(picstr)fromclobtest_table;


(3)對資料庫clob型執行讀取操作
*************************************************

讀取相對插入就很簡單了。基本步驟和一半的取資料庫數據沒有太大的差別。
Stringdescription=""
query="selectpicstrfromclobtest_tablewhereid='001'";
pstmt=con.prepareStatement(query);
ResultSetresult=pstmt.executeQuery();
if(result.next()){
oracle.jdbc.driver.OracleResultSetors=
(oracle.jdbc.driver.OracleResultSet)result;
oracle.sql.CLOBclobtmp=(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

看看錶空間中欄位的屬性,插入的欄位類型要和資料庫中的類型一樣

『叄』 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(); } } }

『肆』 java讀取blob並用base64碼進行保存

轉換沒有問題。
但是讀有問題。不要指望read可以一次性完成,雖然通常可以。
請檢查read的返回值。

另外建議使用try(....){}格式!

base64非常簡單,就是3*8=4*6的轉換。
8表示一個卦8爻,6表示轉換後的實際上一個卦6爻。
卦-->byte
爻-->bit
但是base64有幾種不同格式,而且是誰用誰知道的方式。可以看看其他更詳細的介紹。

『伍』 用JAVA怎樣將保存在資料庫BLOB類型的圖片取出來轉換為圖片然後在頁面展示啊

呵呵,這個是沒有辦法接受哦。
request.setCharacterEncoding("UTF-8");
response.setContentType("image/jpeg");
response.getOutputStream().write(bytes);
這幾個參數是把這個圖片直接發給瀏覽器,說白了就直接把圖片當成文件讓瀏覽器下載。
解決辦法:
<img border=0 src="localhost:8080/Pic" />
localhost:8080是你配置WEB.XML
Pic是你的Servlet類名。

『陸』 使用java語言操作,如何來實現MySQL中Blob欄位的存取

/**
* Title: BlobPros.java
* Project: test
* Description: 把圖片存入mysql中的blob欄位,並取出
* Call Mole: 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=wind&password=123&useUnicode=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());
}
}
}

『柒』 java 存儲數據到blob

將字元串轉換成byte數組String.getBytes(),然後放進一個ByteArrayInputStream輸入流中即可存入BLOB欄位中
PreparedStatement.setBlob(int parameterIndex, InputStream inputStream)

閱讀全文

與java保存blob相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:962
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:142
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:736
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:484
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:381
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163