操作CLOB¶
创建或者获取了一个Clob对象之后,就可以对该Clob对象进行操作了,比如读取数据,查找数据,写入数据,截取数据,获取Clob对象中数据的长度等操作。下面将一一作介绍。
获取Clob对象中数据的长度
直接调用Clob接口中的length()就行了
int length = (int) clob.length();
读取Clob对象中的数据
读取数据有两种方法,第一种是直接从Clob对象中读取,第二种是从流中读取。
方法一:
在这种方法中Clob对象允许用户指定读取数据的起始位置和读取数据的长度,读出的数据是byte数据,比如从第100个character开始,读100个characters
value = clob.getSubString(100,100);
方法二:
在这种方法中,允许用户通过Clob对象先创建一个java.io.InputStream流或java.io.Reader流,java.io.InputSteam流是用来读取Ascii字符的,而java.io.Reader流是用来读取Unicode-16字符的;然后可以用创建的流来读数据。
java.io.InputStream is = clob.getAsciiStream();
int len = 0;
byte[] by = new byte[100];
while ((length = is.read(by)) > 0){
//对数据进行处理
}
查找数据
Clob对象中允许用户查找一个字符串,也允许用户查找另外一个Clob对象
查找字符串,可以指定在Clob对象中查找的起始位置,比如从第100个字符开始查找
//查找一个字符串
int pos = (int) clob.position("d",10);
查找另外一个Clob对象,也可以指定在Clob对象中查找的起始位置,比如从第100个字符开始查找
//查找另外一个Clob对象
Clob anotherClob=( (OscarJdbc2Connection) con).createClob();
pos = (int) clob.position(anotherClob,100);
往Clob对象中写数据
同读数据一样,写数据也有两种方法,第一种是直接往Clob对象中写数据,第二种则是通过流来写数据。写数据的时候,要将Connection对象的auto-commit模式设为false;否则的话,如果中间有一次写数据出错,前面的数据将已经被写到数据库中,不能再回退了。
方法一:
在这种方法中,允许用户指定Clob对象的起始位置,然后从该位置开始写数据,比如从第100个字符开始写数据。
//往Clob对象中写数据,方法一
clob.setString(100,value);
方法二:
在这种方法中,用户通过Blob对象先创建一个java.io.OutputStream流或java.io.Writer流,然后用创建的流来写数据,java.io.OutputStream流是用来写入Ascii字符,java.io.Writer流是用来写入Unicode-16字符的。同上面一样,用户也可以指定写Clob对象的起始位置, 比如从第100个字符开始写数据。
//往Clob对象中写数据,方法二
java.io.OutputStream os = clob.setAsciiStream(100);
length = 0;
byte[] 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();
截取Clob对象数据
在Clob对象中允许用户将Clob对象的数据截至指定的长度,比如可以将Clob对象截至长度为1000。
//现在Clob对象中的数据就不超过1000了
clob.truncate(1000);