操作BLOB的数据¶
创建或者获取了一个Blob对象之后,就可以对该Blob对象进行操作了,比如读取数据,查找数据,写入数据,截取数据,获取Blob对象中数据的长度等操作。下面将一一作介绍。
获取Blob对象中数据的长度
直接调用Blob接口中的length()就行了
int length = (int) blob.length();
读取Blob对象中的数据
读取数据有两种方法,第一种是直接从Blob对象中读取,第二种是从流中读取。
方法一:
在这种方法中Blob对象允许用户指定读取数据的起始位置和读取数据的长度,读出的数据是byte数据,比如从第100个byte开始,读100个bytes。
byte[] bt = blob.getBytes(100,100);
方法二:
在这种方法中用户先使用Blob对象创建一个java.io.InputStream流,然后用该流来读数据。
int len = 0;
byte[] by = new byte[100];
while ((length = is.read(bytes)) > 0){
//对数据进行处理
}
查找数据
Blob对象中允许用户查找一个byte数组,也允许用户查找另外一个Blob对象
查找byte数组,可以指定在Blob对象中查找的起始位置,比如从第100个byte开始查找
//查找一个byte数组
int pos = (int) blob.position(bytes,100);
查找另外一个Blob对象,也可以指定在Blob对象中查找的起始位置,比如从第100个byte开始查找
//查找另外一个Blob对象
Blob anotherBlob=( (OscarJdbc2Connection) con).createBlob();
pos = (int) blob.position(anotherBlob,100);
往Blob对象中写数据
同读数据一样,写数据也有两种方法,第一种是直接往Blob对象中写数据,第二种则是通过流来写数据。写数据的时候,要将Connection对象的auto-commit模式设为false;否则的话,如果中间有一次写数据出错,前面的数据将已经被写到数据库中,不能再回退了。
方法一:
在这种方法中,允许用户指定Blob对象的起始位置,然后从该位置开始写数据,比如从第100个byte开始写数据。
//往Blob对象中写数据,方法一
blob.setBytes(100,bytes);
方法二:
在这种方法中Blob对象先创建一个java.io.OutputStream流,然后用该流来写数据,同上面一样,用户也可以指定写Blob对象的起始位置, 比如从第100个byte开始写数据。
//往Blob对象中写数据,方法二
java.io.OutputStream os = blob.setBinaryStream(100);
length = 0;
bytes = new byte[100];
//这里省略对异常的捕捉
FileInputStream fis = new FileInputStream("test/bin.txt");
while ((length = fis.read(bytes)) > 0){
//写数据
os.write(bytes,0,length);
}
//最后别忘了,将缓冲区的数据清空,
os.flush();
//调用os.close()时,会自动将缓冲区的数据清空,
//所以上面的flush()方法可以不调用
os.close();
fis.close();
截取Blob对象数据
在Blob对象中允许用户将Blob对象的数据截至指定的长度,比如可以将Blob对象截至长度为1000。
//现在blob对象中的数据就不超过1000了
blob.truncate(1000);