A表card字段是clob类型的,里面存储的是和properties文件内容中一样的存储方式,
例如:select.producttype.CPC10313.text=中银王府井百货卡
select.producttype.CPC10313.code=CPC10313
select.producttype.CPC10313.isphoto=0
select.producttype.CPC10318.text=欧尚阿卡中银联名卡
select.producttype.CPC10318.code=CPC10318
select.producttype.CPC10318.isphoto=0
我只想要其中的一条数据,但我读取出所有数据是乱码,代码如下:
String strSql = "select properties from boc_bccs_sysparam b where b.id=3";
ResultSet rs = stmt.executeQuery(strSql);
if (rs.next()) {
CLOB clob = ((OracleResultSet) rs).getCLOB(1);
if (clob != null) {
Reader reader = clob.characterStreamValue();
String string = IOUtils.toString(reader);
string=new String(string.getBytes("ISO-8859-1"),"GBK");
InputStream inputStream = IOUtils.toInputStream(string);
Properties props = new Properties();
props.load(inputStream);
Set<Entry<Object, Object>> entrySet = props.entrySet();
ProductType productType=null;
for(Entry<Object,Object> entry:entrySet){
String key=(String) entry.getKey();
String value=(String) entry.getValue();
if(key.startsWith ("select.producttype"&&key.endsWith("text")){
String[] keyArr=key.split("\\.");
productType=new ProductType();
productType.setCode(keyArr[2]);
productType.setText(value);
productTypeList.add(productType);
}
}
运行结果如下:
CPC10205===??????????????6????????????¨??ê????±í
CPC20207===????????JCB°????????¨
CPC10001===??????????????????¨??ê????±í
CPC20234===????????·????????????????????????????¨
CJY03===??????????????????????????¨
[b]那就在getvalue的时候,转码转回来。
[/b]
[code="java"]
String value=(String) entry.getValue();
// 试试
value = new String(value.getByte("ISO8859-1"),"GBK");
[/code]
[code="java"]Reader reader = clob.characterStreamValue();
String string = IOUtils.toString(reader);
string=new String(string.getBytes("ISO-8859-1"),"GBK");
InputStream inputStream = IOUtils.toInputStream(string);[/code]
乱码,应该产生于这一块
[b]改成如下试试,即传入到Properties中的是Reader。[/b]
[code="java"]
String string = IOUtils.toString(reader);
string=new String(string.getBytes("ISO-8859-1"),"GBK");
// 确认上述步骤后,string是没有乱码?
System.out.println(string);
//InputStream inputStream = IOUtils.toInputStream(string);
StringReader reader = new StringReader(string);
Properties props = new Properties();
//props.load(inputStream);
props.load(reader);[/code]
先用pl/sql连接数据库看看数据库中是不是乱码.
有可能在存入时就乱码了
[quote]string确实是乱码,但当string不是乱码时,最后取出的值还是乱码,props不能加载字符串啊[/quote]
[color=blue][b]首先,将String改为正常的形式。该问题可能出现在:[/b][/color]
[code="java"]Reader reader = clob.characterStreamValue();
String string = IOUtils.toString(reader);
string=new String(string.getBytes("ISO-8859-1"),"GBK");
[/code]
[b]
逐步调试。[/b]
[color=blue][b]
其次,prop不可以加载String,但是可以Reader呀。通过StringReader将String转为Reader就可了。[/b][/color]
[b]不好意思,这是1.6后才有的方法。[/b]
[code="java"]public void load(Reader reader)[/code]
[b]
问题在于String的乱码。String的乱码解决了?[/b]
String string = IOUtils.toString(reader);
打印这里的string 看看是不是乱码??