操作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);