⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbf.java

📁 geotools的源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package uk.ac.leeds.ccg.dbffile;

import java.io.*;
import java.util.*;
import java.lang.*;
import java.net.*;
import cmp.LEDataStream.*;

/**
 *
 * This class represents a DBF (or DBase) file.<p>
 * Construct it with a URL or File (including the .dbf)
 * this causes the header and field definitions to be read.<p>
 * Later queries return rows or columns of the database.<p>
 * If a URL is specified then the whole file is read into memory<br>
 * if a file is specified then a randomAccess system is used.<br>
 *<hr>
 * @author <a href="mailto:ian@geog.leeds.ac.uk">Ian Turton</a> Centre for
 * Computaional Geography, University of Leeds, LS2 9JT, 1998.
 * <br>
 * mod to getStringCol by James Macgill.
 */
public class Dbf implements DbfConsts{
    static final boolean DEBUG=false;
		static final String DBC="Dbf->";
    int dbf_id;
    int last_update_d,last_update_m,last_update_y;
    int last_rec;
    int data_offset;
    int rec_size;
		StringBuffer records[];
		int position=0;
    boolean hasmemo;
    boolean isFile = false;
    RandomAccessFile rFile;
    LEDataInputStream dFile;
    int filesize,numfields;
    public DbfFieldDef fielddef[];

		/**
			* Constructor, opens the file and reads the header infomation.
			* @param file The file to be opened, includes path and .dbf
			* @exception java.io.IOException If the file can't be opened.
			* @exception DbfFileException If there is an error reading header.
			*/
    public Dbf(URL url) throws java.io.IOException,DbfFileException{
		if(DEBUG)System.out.println("---->uk.ac.leeds.ccg.dbffile.Dbf constructed. Will identify itself as "+DBC);
		URLConnection uc = url.openConnection();
		InputStream in = uc.getInputStream();
		LEDataInputStream sfile = new LEDataInputStream(in);
		init(sfile);
    }

    public Dbf(InputStream in) throws java.io.IOException,DbfFileException{
		if(DEBUG)System.out.println("---->uk.ac.leeds.ccg.dbffile.Dbf constructed. Will identify itself as "+DBC);
		LEDataInputStream sfile = new LEDataInputStream(in);
		init(sfile);
    }

    public Dbf(String name) throws java.io.IOException,DbfFileException{
		if(DEBUG)System.out.println("---->uk.ac.leeds.ccg.dbffile.Dbf constructed. Will identify itself as "+DBC);
		URL url = new URL(name);
		URLConnection uc = url.openConnection();
		InputStream in = uc.getInputStream();
		LEDataInputStream sfile = new LEDataInputStream(in);
		init(sfile);
    }

    public Dbf(File file) throws java.io.IOException,DbfFileException{
		if(DEBUG)System.out.println("---->uk.ac.leeds.ccg.dbffile.Dbf constructed. Will identify itself as "+DBC);
		InputStream in = new FileInputStream(file);
		LEDataInputStream sfile = new LEDataInputStream(in);
		rFile=new RandomAccessFile(file,"r");
		isFile=true;
		init(sfile);
    }
		/**
			* Returns the date of the last update of the file as a string.
			*/
    public String getLastUpdate(){
      String date=last_update_d+"/"+(last_update_m+1)+"/"+(1900+last_update_y);
      return date;
    }

		/**
			* Returns the number of records in the database file.
			*/
    public int getLastRec(){
      return last_rec;
    }
		/**
			* Returns the size of the records in the database file.
			*/
    public int getRecSize(){
      return  rec_size;
    }
		/**
			* Returns the number of fields in the records in the database file.
			*/
    public int getNumFields(){
      return numfields;
    }

    /**
     * looks up the field number for the given named column
     * @param name A String for the name to look up
     * @return int The col number for the field, -1 if field could not be found
     */
    public int getFieldNumber(String name){
        for(int i=0;i<numfields;i++){
            //System.out.println(i);
            if(name.equalsIgnoreCase(fielddef[i].fieldname.toString())){
                return i;
            }
        }
        return -1;//not found
    }
		/**
			* Returns the size  of the database file.
			*/
    public int getFileSize(){
      return  filesize;
    }
	public StringBuffer getFieldName(int col){
		if(col>=numfields) throw new IllegalArgumentException(DBC+"column number specified is invalid. It's higher than the amount of columns available "+numfields);
		return  fielddef[col].fieldname;
	}
	public char getFieldType(int col){
		if(col>=numfields) throw new IllegalArgumentException(DBC+"column number specified is invalid. It's higher than the amount of columns available"+numfields);
		return fielddef[col].fieldtype;
	}

		/**
		  * initailizer, allows the use of multiple constructers in later
			* versions.
			*/

    private void init(LEDataInputStream sfile)throws
      IOException,DbfFileException {
      DbfFileHeader head = new DbfFileHeader(sfile);
      int widthsofar;

      dFile=sfile;

      fielddef = new DbfFieldDef[numfields];
      widthsofar=1;
      for(int index=0;index<numfields;index++){
        fielddef[index] = new DbfFieldDef();
				fielddef[index].setup(widthsofar,sfile);
        widthsofar+=fielddef[index].fieldlen;
      }
      sfile.skipBytes(1); // end of field defs marker
      if(!isFile){
			records=GrabFile();
	  }
    }
	/**
		* Internal Class to hold information from the header of the file
		*/
  class DbfFileHeader{


		/**
			* Reads the header of a dbf file.
			* @param LEDataInputStream file Stream attached to the input file
			* @exception IOException read error.
			*/
    public  DbfFileHeader(LEDataInputStream file) throws IOException {
      getDbfFileHeader(file);
    }
    private void getDbfFileHeader(LEDataInputStream file) throws IOException {

      int len;
      dbf_id=(int)file.readUnsignedByte();
      if(DEBUG)System.out.println(DBC+"Header id "+dbf_id);
      if(dbf_id==3) hasmemo=true;
      else hasmemo=false;

      last_update_y=(int)file.readUnsignedByte();
      last_update_m=(int)file.readUnsignedByte();
      last_update_d=(int)file.readUnsignedByte();
      if(DEBUG)System.out.print(DBC+"last update ");
      if(DEBUG)System.out.print(last_update_d);
      if(DEBUG)System.out.print("/");
      if(DEBUG)System.out.print(last_update_m);
      if(DEBUG)System.out.print("/");
      if(DEBUG)System.out.println(last_update_y);

      last_rec=file.readInt();
      if(DEBUG)System.out.print(DBC+"last rec ");
      if(DEBUG)System.out.println(last_rec);

      data_offset=file.readShort();
			//data_offset=0;
			//System.out.println("x = "+file.readUnsignedByte()+" " +
				//file.readUnsignedByte());
      if(DEBUG)System.out.print(DBC+"data offset ");
      if(DEBUG)System.out.println(data_offset);

      rec_size=file.readShort();
      if(DEBUG)System.out.print(DBC+"rec_size ");
      if(DEBUG)System.out.println(rec_size);

      filesize=(rec_size * last_rec) + data_offset+1;
      numfields = (data_offset - DBF_BUFFSIZE -1)/DBF_BUFFSIZE;

      if(DEBUG)System.out.print(DBC+"num fields ");
      if(DEBUG)System.out.println(numfields);
      if(DEBUG)System.out.print(DBC+"file size ");
      if(DEBUG)System.out.println(filesize);
      file.skipBytes(20);
    }

  }
	/**
		* gets the next record and returns it as a string. This method works on
		* a sequential stream and can not go backwards. Only useful if you want
		* to read the whole file in one.
		* @exception java.io.IOException on read error.
		*/
  public  StringBuffer GetNextDbfRec()throws java.io.IOException{
		return records[position++];
	}

  private StringBuffer GrabNextDbfRec()throws java.io.IOException{
      StringBuffer record = new StringBuffer(rec_size+numfields);
      
      //Modifed to use Hisaji ONO's approach for reading multi byte character sets
      byte[] strbuf = new byte[rec_size]; // <---- byte array buffer fo storing string's byte data  
      for(int i=0;i<rec_size;i++){
          strbuf[i] = dFile.readByte(); // <---- read string's byte data
      }
      record.append(new String(strbuf)); // <- append byte array to String Buffer
      
      return record;
  }

	private StringBuffer[] GrabFile() throws java.io.IOException{
		StringBuffer records[] = new StringBuffer[last_rec];
		for(int i=0;i<last_rec;i++)
			records[i]=GrabNextDbfRec();
		return records;
	}





	/**
         * fetches the <i>row</i>th row of the file
         * @param row - the row to fetch
         * @exception java.io.IOException on read error.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -