阅读:2875回复:4
我重写的读dbf的代码( MyDbf.java)(geotools)
<P>geotools读中文字段会出错,是因为它把一个记录做为一个StringBuffer处理的,中文两个Byte合成了一个字,所以合成StringBuffer之后再找位置就出错了。解决办法是把一个记录做为一个StringBuffer的数组,取值的时候按数组内的顺序查找位置</P>
<P>其实继承可以少写点代码,但是。。。。。看了原来的代码实在生气,其实大部分代码还是 copy的。</P> <P>可能用到了我改写的其它类,也可能没有,不记得了。要有的话改成引用原来的应该可以编译通过。</P> <P>package uk.ac.leeds.ccg.dbffile;</P> <P>import cmp.LEDataStream.LEDataInputStream; import java.io.*; import java.net.URL; import java.net.URLConnection; import java.util.Vector;</P> <P>public class MyDbf implements DbfConsts { class DbfFileHeader { private void getDbfFileHeader(LEDataInputStream file) throws IOException { dbf_id = file.readUnsignedByte(); if(dbf_id == 3) hasmemo = true; else hasmemo = false; last_update_y = file.readUnsignedByte(); last_update_m = file.readUnsignedByte(); last_update_d = file.readUnsignedByte(); last_rec = file.readInt(); data_offset = file.readShort(); rec_size = file.readShort(); filesize = rec_size * last_rec + data_offset + 1; numfields = (data_offset - 32 - 1) / 32; file.skipBytes(20); }</P> <P> public DbfFileHeader(LEDataInputStream file) throws IOException { getDbfFileHeader(file); } } class Record { private int numfields; private StringBuffer[] record; public Record(int field_count) { numfields = field_count; record = new StringBuffer[field_count]; } public void addData(StringBuffer data, int seq) { if (seq < numfields) record[seq] = data; else System.out.println("Dbf->Record->Error!!! Out of numfield boundary!!!"); } public StringBuffer getData(int seq) { if(seq < numfields) return record[seq]; else { System.out.println("Dbf->Record->Error!!! Data not found!!!"); return new StringBuffer(""); } } } static final boolean DEBUG = false; static final String DBC = "Dbf->"; int dbf_id; int last_update_d; int last_update_m; int last_update_y; int last_rec; int data_offset; int rec_size; Record records[]; int position; boolean hasmemo; boolean isFile; RandomAccessFile rFile; LEDataInputStream dFile; int filesize; int numfields; public DbfFieldDef fielddef[];</P> <P> public MyDbf(URL url) throws DbfFileException, IOException { position = 0; isFile = false; URLConnection uc = url.openConnection(); InputStream in = uc.getInputStream(); LEDataInputStream sfile = new LEDataInputStream(in); init(sfile); }</P> <P> public MyDbf(InputStream in) throws DbfFileException, IOException { position = 0; isFile = false; LEDataInputStream sfile = new LEDataInputStream(in); init(sfile); }</P> <P> public MyDbf(String name) throws DbfFileException, IOException { position = 0; isFile = false; URL url = new URL(name); URLConnection uc = url.openConnection(); InputStream in = uc.getInputStream(); LEDataInputStream sfile = new LEDataInputStream(in); init(sfile); }</P> <P> public MyDbf(File file) throws DbfFileException, IOException { position = 0; isFile = false; InputStream in = new FileInputStream(file); LEDataInputStream sfile = new LEDataInputStream(in); rFile = new RandomAccessFile(file, "r"); isFile = true; init(sfile); }</P> <P> public String getLastUpdate() { String date = String.valueOf((new StringBuffer(String.valueOf(last_update_d))).append("/").append(last_update_m + 1).append("/").append(1900 + last_update_y)); return date; }</P> <P> public int getLastRec() { return last_rec; }</P> <P> public int getRecSize() { return rec_size; }</P> <P> public int getNumFields() { return numfields; }</P> <P> public int getFieldNumber(String name) { for(int i = 0; i < numfields; i++) if(name.equalsIgnoreCase(fielddef.fieldname.toString())) return i;</P> <P> return -1; }</P> <P> public int getFileSize() { return filesize; }</P> <P> public StringBuffer getFieldName(int col) { if(col >= numfields) throw new IllegalArgumentException("Dbf->column number specified is invalid. It's higher than the amount of columns available ".concat(String.valueOf(String.valueOf(numfields)))); else return fielddef[col].fieldname; }</P> <P> public char getFieldType(int col) { if(col >= numfields) throw new IllegalArgumentException("Dbf->column number specified is invalid. It's higher than the amount of columns available".concat(String.valueOf(String.valueOf(numfields)))); else return fielddef[col].fieldtype; }</P> <P> private void init(LEDataInputStream sfile) throws DbfFileException, IOException { DbfFileHeader head = new DbfFileHeader(sfile); dFile = sfile; fielddef = new DbfFieldDef[numfields]; int widthsofar = 1; for(int index = 0; index < numfields; index++) { fielddef[index] = new DbfFieldDef(); fielddef[index].setup(widthsofar, sfile); widthsofar += fielddef[index].fieldlen; }</P> <P> sfile.skipBytes(1); if(!isFile) records = GrabFile(); }</P> <P> public Record GetNextDbfRec() throws IOException { return records[position++]; }</P> <P> private Record GrabNextDbfRec() throws IOException { Record record = new Record(numfields); int len; dFile.skipBytes(1); for(int index = 0; index < numfields; index++) { len = fielddef[index].fieldlen; StringBuffer oneRec = new StringBuffer(len); byte strbuf[] = new byte[len]; for(int i = 0; i < len; i++) strbuf = dFile.readByte(); oneRec.append(new String(strbuf)); record.addData(oneRec, index); } return record; }</P> <P> private Record[] GrabFile() throws IOException { Record records[] = new Record[last_rec]; for(int i = 0; i < last_rec; i++) records = GrabNextDbfRec(); return records; }</P> <P> public Record GetDbfRec(int row) throws IOException { Record record; int len; if(!isFile) return records[row]; record = new Record(numfields); rFile.seek(data_offset + rec_size * row); for(int index = 0; index < numfields; index++) { len = fielddef[index].fieldlen; StringBuffer oneRec = new StringBuffer(len); byte strbuf[] = new byte[len]; for(int i = 0; i < len; i++) strbuf = dFile.readByte(); oneRec.append(new String(strbuf)); record.addData(oneRec, index); } return record; }</P> <P> public Vector ParseDbfRecord(int row) throws IOException { return ParseRecord(GetDbfRec(row)); }</P> <P> public Vector ParseRecord(Record rec) { Vector record = new Vector(numfields); Integer I = new Integer(0); Float F = new Float(0.0D); for(int i = 0; i < numfields; i++) switch(fielddef.fieldtype) { default: break;</P> <P> case 67: // 'C' record.addElement((rec.getData(i)).toString()); break;</P> <P> case 70: // 'F' case 78: // 'N' if(fielddef.fieldnumdec == 0) { try { record.addElement(Integer.decode(PeshStringAproach((rec.getData(i)).toString()))); } catch(NumberFormatException e) { record.addElement(new Integer(0)); } break; } try { record.addElement(Float.valueOf(PeshStringAproach((rec.getData(i)).toString()))); } catch(NumberFormatException e) { record.addElement(new Float(0.0D)); } break; } return record; }</P> <P> String PeshStringAproach(String s) { return ReplToSpecSysmb(s, " ", "", 0); }</P> <P> String ReplToSpecSysmb(String s, String delet, String insert, int offs) { if(s == null) return ""; for(int n = 0; (n = s.indexOf(delet, n)) >= 0;) { String res = String.valueOf(s.substring(0, n - offs)) + String.valueOf(insert); int k = res.length(); try { res = String.valueOf(res) + String.valueOf(s.substring(n + 1)); } catch(StringIndexOutOfBoundsException stringindexoutofboundsexception) { } n = k; s = res; }</P> <P> return s; }</P> <P> public Integer[] getIntegerCol(int col) throws DbfFileException, IOException { return getIntegerCol(col, 0, last_rec); }</P> <P> public Integer[] getIntegerCol(int col, int start, int end) throws DbfFileException, IOException { Integer column[] = new Integer[end - start]; Record sb = new Record(numfields); String record; int k = 0; int i = 0; if(col >= numfields) throw new DbfFileException("Dbf->No Such Column in file: ".concat(String.valueOf(String.valueOf(col)))); if(fielddef[col].fieldtype != 'N') throw new DbfFileException(String.valueOf(String.valueOf((new StringBuffer("Dbf->Column ")).append(col).append(" is not Integer ").append(fielddef[col].fieldtype)))); if(start < 0) throw new DbfFileException("Dbf->Start must be >= 0"); if(end > last_rec) throw new DbfFileException("Dbf->End must be <= ".concat(String.valueOf(String.valueOf(last_rec)))); try { for(i = start; i < end; i++) { sb = GetDbfRec(i); record = (sb.getData(col)).toString(); column[i - start] = new Integer(record); } } catch(NumberFormatException nfe) { column[i - start] = new Integer(0); } catch(EOFException e) { System.err.println(e); System.err.println(String.valueOf(String.valueOf((new StringBuffer("Dbf->record ")).append(i).append(" byte ").append(k).append(" file pos ")))); } catch(IOException e) { System.err.println(e); System.err.println(String.valueOf(String.valueOf((new StringBuffer("Dbf->record ")).append(i).append(" byte ").append(k).append(" file pos ")))); } return column; }</P> <P> public Float[] getFloatCol(int col) throws IOException, DbfFileException { return getFloatCol(col, 0, last_rec); }</P> <P> public Float[] getFloatCol(int col, int start, int end) throws IOException, DbfFileException { Float column[] = new Float[end - start]; Record sb = new Record(numfields); String record; int k = 0; int i = 0; if(col >= numfields) throw new DbfFileException("Dbf->No Such Column in file: ".concat(String.valueOf(String.valueOf(col)))); if(fielddef[col].fieldtype != 'F' ;; fielddef[col].fieldtype != 'N') throw new DbfFileException(String.valueOf(String.valueOf((new StringBuffer("Dbf->Column ")).append(col).append(" is not Float ").append(fielddef[col].fieldtype)))); if(start < 0) throw new DbfFileException("Dbf->Start must be >= 0"); if(end > last_rec) throw new DbfFileException("Dbf->End must be <= ".concat(String.valueOf(String.valueOf(last_rec)))); try { for(i = start; i < end; i++) { sb = GetDbfRec(i); record = (sb.getData(col)).toString(); String st = record.trim(); if(st.indexOf(46) == -1) st = st.concat(".0"); try { column[i - start] = new Float(st); } catch(NumberFormatException e) { column[i - start] = new Float(0.0D); } } } catch(EOFException e) { System.err.println("Dbf->".concat(String.valueOf(String.valueOf(e)))); System.err.println(String.valueOf(String.valueOf((new StringBuffer("Dbf->record ")).append(i).append(" byte ").append(k).append(" file pos ")))); } catch(IOException e) { System.err.println("Dbf->".concat(String.valueOf(String.valueOf(e)))); System.err.println(String.valueOf(String.valueOf((new StringBuffer("Dbf->record ")).append(i).append(" byte ").append(k).append(" file pos ")))); } return column; }</P> <P> public String[] getStringCol(int col) throws IOException, DbfFileException { return getStringCol(col, 0, last_rec); }</P> <P> public String[] getStringCol(int col, int start, int end) throws IOException, DbfFileException { String column[] = new String[end - start]; Record sb = new Record(numfields); String record; int k = 0; int i = 0; if(col >= numfields) throw new DbfFileException("Dbf->No Such Column in file: ".concat(String.valueOf(String.valueOf(col)))); if(start < 0) throw new DbfFileException("Dbf->Start must be >= 0"); if(end > last_rec) throw new DbfFileException("Dbf->End must be <= ".concat(String.valueOf(String.valueOf(last_rec)))); try { for(i = start; i < end; i++) { sb = GetDbfRec(i); record = (sb.getData(col)).toString(); column[i - start] = record; }</P> <P> } catch(EOFException e) { System.err.println("Dbf->".concat(String.valueOf(String.valueOf(e)))); System.err.println(String.valueOf(String.valueOf((new StringBuffer("Dbf->record ")).append(i).append(" byte ").append(k).append(" file pos ")))); } catch(IOException e) { System.err.println("Dbf->".concat(String.valueOf(String.valueOf(e)))); System.err.println(String.valueOf(String.valueOf((new StringBuffer("Dbf->record ")).append(i).append(" byte ").append(k).append(" file pos ")))); } return column; } } </P> |
|
1楼#
发布于:2005-05-30 12:20
<br>
<img src="images/post/smile/dvbbs/em01.gif" /><img src="images/post/smile/dvbbs/em01.gif" /> |
|
|
2楼#
发布于:2005-07-05 10:13
<P>大家有没用geotools做出来的界面什么的,发个上来看看,呵呵</P>
<P>偶还没用过,不好意思发言</P> |
|
|
3楼#
发布于:2005-07-07 20:17
<P>现在还在系统建设阶段,没有做界面。界面准备放到最后做。不过现在有一个很简单的测试界面,不知道怎么放上来。</P>
|
|
4楼#
发布于:2005-11-12 15:06
<IMG src="http://www.gisempire.com/bbs/Skins/Default/emot/em02.gif">
|
|