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

📄 dbfoutputstream.java

📁 openmap java写的开源数字地图程序. 用applet实现,可以像google map 那样放大缩小地图.
💻 JAVA
字号:
// **********************************************************************// // <copyright>// //  BBN Technologies//  10 Moulton Street//  Cambridge, MA 02138//  (617) 873-8000// //  Copyright (C) BBNT Solutions LLC. All rights reserved.// // </copyright>// **********************************************************************// // $Source: /cvs/distapps/openmap/src/openmap/com/bbn/openmap/dataAccess/shape/output/DbfOutputStream.java,v $// $RCSfile: DbfOutputStream.java,v $// $Revision: 1.6.2.6 $// $Date: 2006/01/27 18:37:17 $// $Author: dietrick $// // **********************************************************************package com.bbn.openmap.dataAccess.shape.output;import java.io.BufferedOutputStream;import java.io.IOException;import java.io.OutputStream;import java.text.NumberFormat;import java.util.Locale;import com.bbn.openmap.dataAccess.shape.DbfTableModel;/** * Writes date in a DbfTableModel to a file, conforming to the DBF III file * format specification *  * @author Doug Van Auken */public class DbfOutputStream {    /**     * An outputstream that writes primitive data types in little endian or big     * endian     */    private LittleEndianOutputStream _leos;    /**     * Creates a DbfOutputStream     */    public DbfOutputStream(OutputStream os) {        BufferedOutputStream bos = new BufferedOutputStream(os);        _leos = new LittleEndianOutputStream(bos);    }    /**     * Writes the model out on the stream. The stream is closed automatically     * after the write.     *      * @param model the tablemodel to write     */    public void writeModel(DbfTableModel model) throws IOException {        int rowCount = model.getRowCount();        short headerLength = calcHeaderLength(model);        short recordLength = calcRecordLength(model);        writeHeader(rowCount, headerLength, recordLength);        writeFieldDescriptors(model);        writeRecords(model);        close();    }    /**     * Calculates the length of the record by aggregating the length of each     * field     *      * @param model The DbfTableModel for which to calculate the record length     * @return The length of a record     */    public short calcRecordLength(DbfTableModel model) {        int length = 0;        int columnCount = model.getColumnCount();        for (int i = 0; i <= columnCount - 1; i++) {            length += model.getLength(i);        }        length += 1;        Integer integer = new Integer(length);        return integer.shortValue();    }    /**     * Calculates the length of the header in terms of bytes     *      * @param model The DbfTableModel for which to calculate header length     * @return The header length     */    public short calcHeaderLength(DbfTableModel model) {        int length = 0;        length += model.getColumnCount() * 32; // 32 bytest for each        // record        length += 32; // 32 bytes for the record        length += 1; // 1 byte for header terminator        Integer integer = new Integer(length);        return integer.shortValue();    }    /**     * Writes the header to the class scope LittleEndianOutputStream     *      * @param rowCount The number of records     * @param headerLength The length, in terms of bytes, of the header section     * @param recordLength The length, in terms of bytes, of each records     */    private void writeHeader(int rowCount, short headerLength,                             short recordLength) throws IOException {        _leos.writeByte(3); // byte 0        _leos.writeByte(96); // Byte 1 - Year        _leos.writeByte(4); // Byte 2 - Month        _leos.writeByte(30); // Byte 3 - Day        _leos.writeLEInt(rowCount); // Byte 4 Number of records in the        // table        _leos.writeLEShort(headerLength); // byte 8 Number of bytes in        // the header        _leos.writeLEShort(recordLength); // byte 10 Number of bytes        // in the record        _leos.writeByte(0); // Byte 12        _leos.writeByte(0); // Byte 13        _leos.writeByte(0); // Byte 14        _leos.writeByte(0); // Byte 15        _leos.writeByte(0); // Byte 16        _leos.writeByte(0); // Byte 17        _leos.writeByte(0); // Byte 18        _leos.writeByte(0); // Byte 19        _leos.writeByte(0); // Byte 20        _leos.writeByte(0); // Byte 21        _leos.writeByte(0); // Byte 22        _leos.writeByte(0); // Byte 23        _leos.writeByte(0); // Byte 24        _leos.writeByte(0); // Byte 25        _leos.writeByte(0); // Byte 26        _leos.writeByte(0); // Byte 27        _leos.writeByte(0); // Byte 28        _leos.writeByte(0); // Byte 29        _leos.writeByte(0); // Byte 30        _leos.writeByte(0); // Byte 31    }    /**     * Iterates through the DbfTableModel's collection of columns and calls the     * writeFieldDescriptor method for each column     *      * @param model The DbfTableModel     */    private void writeFieldDescriptors(DbfTableModel model) throws IOException {        int columnCount = model.getColumnCount();        for (int i = 0; i <= columnCount - 1; i++) {            String name = model.getColumnName(i);            int length = model.getLength(i);            byte decimalCount = model.getDecimalCount(i);            byte type = model.getType(i);            writeFieldDescriptor(name, type, length, decimalCount);        }        _leos.writeByte(13);    }    /**     * Writes records to the LittleEndianOutputStream     *      * @param name The field name     * @param type The field type     * @param length The field length     * @param decimalPlaces The number of decimal places for each field     */    private void writeFieldDescriptor(String name, byte type, int length,                                      byte decimalPlaces) throws IOException {        _leos.writeString(name, 11); // Byte 0-10        _leos.writeByte(type); // Byte 11        _leos.writeByte(0); // Byte 12 Field data address(0)        _leos.writeByte(0); // Byte 13 Field data address(1)        _leos.writeByte(0); // Byte 14 Field data address(2)        _leos.writeByte(0); // Byte 15 Field data address(3)        _leos.writeByte(length); // Byte 16 Field length in bytes        _leos.writeByte(decimalPlaces); // Byte 17 Field decimal        // places        _leos.writeByte(0); // Byte 18 Reserved for dBASE III PLUS on        // a LAN(0)        _leos.writeByte(0); // Byte 19 Reserved for dBASE III PLUS on        // a LAN(1)        _leos.writeByte(0); // Byte 20 Work area 1D        _leos.writeByte(0); // Byte 21 Reserved for dBASE III PLUS on        // a LAN(0)        _leos.writeByte(0); // Byte 22 Reserved for dBASE III PLUS on        // a LAN(1)        _leos.writeByte(0); // Byte 23 SET FIELDS Flag        _leos.writeByte(0); // Byte 24 Reserved Bytes(0) #24        _leos.writeByte(0); // Byte 25 Reserved Bytes(0) #25        _leos.writeByte(0); // Byte 26 Reserved Bytes(0) #26        _leos.writeByte(0); // Byte 27 Reserved Bytes(0) #27        _leos.writeByte(0); // Byte 28 Reserved Bytes(0) #28        _leos.writeByte(0); // Byte 29 Reserved Bytes(0) #29        _leos.writeByte(0); // Byte 30 Reserved Bytes(0) #30        _leos.writeByte(0); // Byte 31 Reserved Bytes(0) #31    }    public void writeRecords(DbfTableModel model) throws IOException {        java.text.NumberFormat df = NumberFormat.getNumberInstance(Locale.ENGLISH);        int rowCount = model.getRowCount();        int columnCount = model.getColumnCount();        for (int r = 0; r <= rowCount - 1; r++) {            _leos.writeByte(32);            for (int c = 0; c <= columnCount - 1; c++) {                byte type = model.getType(c);                String value = null;                if (type == DbfTableModel.TYPE_NUMERIC) {                    Object obj = model.getValueAt(r, c);                    if (obj instanceof Double) {                        // Why Number?                        // Number d = (Number)model.getValueAt(r, c);                        // This seems to sometimes write out                        // exponetial numbers, which is bad for                        // reading it back in.                        // value = ((Number)obj).toString();                        // value =                        // df.format(((Double)obj).doubleValue());                        value = "" + df.format(((Double) obj).doubleValue());                    } else {                        // value = "";                         // Instead of making up a value, try to                        // represent it as true as possible.                        value = (value != null)?obj.toString():"";                    }                } else {                    value = (String) model.getValueAt(r, c);                }                int length = model.getLength(c);                _leos.writeString(value, length);            }        }    }    public void close() throws IOException {        _leos.writeByte(26);        _leos.flush();        _leos.close();    }}

⌨️ 快捷键说明

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