Statistics
| Revision:

svn-gvsig-desktop / tags / gvSIGv0_6_1RELEASE / libraries / libFMap / src / com / iver / cit / gvsig / fmap / drivers / dbf / DbaseFile.java @ 5222

History | View | Annotate | Download (9.98 KB)

1
/*
2
 * Created on 16-feb-2004
3
 *
4
 * To change the template for this generated file go to
5
 * Window>Preferences>Java>Code Generation>Code and Comments
6
 */
7
package com.iver.cit.gvsig.fmap.drivers.dbf;
8

    
9

    
10
/**
11
 */
12
import java.io.File;
13
import java.io.FileInputStream;
14
import java.io.IOException;
15
import java.io.RandomAccessFile;
16

    
17
import java.nio.ByteBuffer;
18
import java.nio.channels.FileChannel;
19

    
20
import com.iver.utiles.bigfile.BigByteBuffer;
21

    
22

    
23
/**
24
 * Class to read and write data to a dbase III format file. Creation date:
25
 * (5/15/2001 5:15:13 PM)
26
 */
27
public class DbaseFile {
28
    // Header information for the DBase File
29
    private DbaseFileHeader myHeader;
30
    private RandomAccessFile raf;
31
    private FileChannel channel;
32
    private BigByteBuffer buffer;
33
    private FileChannel.MapMode mode;
34

    
35
    // Retrieve number of records in the DbaseFile
36
    public int getRecordCount() {
37
        return myHeader.getNumRecords();
38
    }
39

    
40
    /**
41
     * DOCUMENT ME!
42
     *
43
     * @return DOCUMENT ME!
44
     */
45
    public int getFieldCount() {
46
        return myHeader.getNumFields();
47
    }
48

    
49
    /**
50
     * DOCUMENT ME!
51
     *
52
     * @param rowIndex DOCUMENT ME!
53
     * @param fieldId DOCUMENT ME!
54
     *
55
     * @return DOCUMENT ME!
56
     */
57
    public boolean getBooleanFieldValue(int rowIndex, int fieldId) {
58
        int recordOffset = (myHeader.getRecordLength() * rowIndex) +
59
            myHeader.getHeaderLength() + 1;
60

    
61
        //Se calcula el offset del campo
62
        int fieldOffset = 0;
63

    
64
        for (int i = 0; i < (fieldId - 1); i++) {
65
            fieldOffset += myHeader.getFieldLength(i);
66
        }
67

    
68
        buffer.position(recordOffset + fieldOffset);
69

    
70
        char bool = (char) buffer.get();
71

    
72
        return ((bool == 't') || (bool == 'T') || (bool == 'Y') ||
73
        (bool == 'y'));
74
    }
75

    
76
    /**
77
     * DOCUMENT ME!
78
     *
79
     * @param rowIndex DOCUMENT ME!
80
     * @param fieldId DOCUMENT ME!
81
     *
82
     * @return DOCUMENT ME!
83
     */
84
    public String getStringFieldValue(int rowIndex, int fieldId) {
85
        int recordOffset = (myHeader.getRecordLength() * rowIndex) +
86
            myHeader.getHeaderLength() + 1;
87

    
88
        //Se calcula el offset del campo
89
        /* int fieldOffset = 0;
90

91
        for (int i = 0; i < fieldId; i++) {
92
            fieldOffset += myHeader.getFieldLength(i);
93
        } */
94
        int fieldOffset = myHeader.getFieldDescription(fieldId).myFieldDataAddress;
95

    
96
        /* System.err.println("getStringFieldValue: rowIndex = " + rowIndex);
97
        System.err.println("recordOffset = " + recordOffset + " fieldOffset=" + fieldOffset); */
98
        buffer.position(recordOffset + fieldOffset);
99

    
100
        byte[] data = new byte[myHeader.getFieldLength(fieldId)];
101
        buffer.get(data);
102

    
103
        return new String(data);
104
    }
105

    
106
    // Retrieve the record at the given index
107

    
108
    /*    public Object[] getRecord(long inIndex) throws IOException {
109
       long nRecordOffset = (myHeader.getRecordLength() * inIndex) +
110
           myHeader.getHeaderLength();
111
       // retrieve the record length
112
       int tempNumFields = myHeader.getNumFields();
113
       // storage for the actual values
114
       Object[] tempRow = new Object[tempNumFields];
115
           buffer.position((int) nRecordOffset);
116
           // read the deleted flag
117
           char tempDeleted = (char) buffer.get();
118
           // read the record length
119
           int tempRecordLength = 1; // for the deleted character just read.
120
           // read the Fields
121
           for (int j = 0; j < tempNumFields; j++) {
122
               // find the length of the field.
123
               int tempFieldLength = myHeader.getFieldLength(j);
124
               tempRecordLength = tempRecordLength + tempFieldLength;
125
               // find the field type
126
               char tempFieldType = myHeader.getFieldType(j);
127
               //System.out.print("Reading Name="+myHeader.getFieldName(j)+" Type="+tempFieldType +" Length="+tempFieldLength);
128
               // read the data.
129
               Object tempObject = null;
130
               switch (tempFieldType) {
131
               case 'L': // logical data type, one character (T,t,F,f,Y,y,N,n)
132
                   char tempChar = (char) buffer.get();
133
                   if ((tempChar == 'T') || (tempChar == 't') ||
134
                           (tempChar == 'Y') || (tempChar == 'y')) {
135
                       tempObject = new Boolean(true);
136
                   } else {
137
                       tempObject = new Boolean(false);
138
                   }
139
                   break;
140
               case 'C': // character record.
141
                   byte[] sbuffer = new byte[tempFieldLength];
142
                                       buffer.get(sbuffer);
143
                   tempObject = new String(sbuffer, "ISO-8859-1").trim();
144
                   break;
145
               case 'D': // date data type.
146
                   byte[] dbuffer = new byte[8];
147
                                       buffer.get(dbuffer);
148
                   String tempString = new String(dbuffer, 0, 4);
149
                   try {
150
                       int tempYear = Integer.parseInt(tempString);
151
                       tempString = new String(dbuffer, 4, 2);
152
                       int tempMonth = Integer.parseInt(tempString) - 1;
153
                       tempString = new String(dbuffer, 6, 2);
154
                       int tempDay = Integer.parseInt(tempString);
155
                       Calendar c = Calendar.getInstance();
156
                       c.set(Calendar.YEAR, tempYear);
157
                       c.set(Calendar.MONTH, tempMonth);
158
                       c.set(Calendar.DAY_OF_MONTH, tempDay);
159
                       tempObject = c.getTime();
160
                   } catch (NumberFormatException e) {
161
                   }
162
                   break;
163
               case 'M': // memo field.
164
                   byte[] mbuffer = new byte[10];
165
                                       buffer.get(mbuffer);
166
                   break;
167
               case 'N': // number
168
               case 'F': // floating point number
169
                   byte[] fbuffer = new byte[tempFieldLength];
170
                                       buffer.get(fbuffer);
171
                   try {
172
                       tempString = new String(fbuffer);
173
                       tempObject = Double.valueOf(tempString.trim());
174
                   } catch (NumberFormatException e) {
175
                   }
176
                   break;
177
               default:
178
                   byte[] defbuffer = new byte[tempFieldLength];
179
                                       buffer.get(defbuffer);
180
                   System.out.println("Do not know how to parse Field type " +
181
                       tempFieldType);
182
               }
183
               tempRow[j] = tempObject;
184
               //                                System.out.println(" Data="+tempObject);
185
           }
186
           // ensure that the full record has been read.
187
           if (tempRecordLength < myHeader.getRecordLength()) {
188
               byte[] tempbuff = new byte[myHeader.getRecordLength() -
189
                   tempRecordLength];
190
               buffer.get(tempbuff);
191
               /* if (tempTelling){
192
                       System.out.println("DBF File has "+(myHeader.getRecordLength()-tempRecordLength)+" extra bytes per record");
193
                       tempTelling = false;
194
               } */
195
    /*           }
196
       return tempRow;
197
       }
198
     */
199

    
200
    /**
201
     * Retrieve the name of the given column.
202
     *
203
     * @param inIndex DOCUMENT ME!
204
     *
205
     * @return DOCUMENT ME!
206
     */
207
    public String getFieldName(int inIndex) {
208
        return myHeader.getFieldName(inIndex).trim();
209
    }
210

    
211
    /**
212
     * Retrieve the type of the given column.
213
     *
214
     * @param inIndex DOCUMENT ME!
215
     *
216
     * @return DOCUMENT ME!
217
     */
218
    public char getFieldType(int inIndex) {
219
        return myHeader.getFieldType(inIndex);
220
    }
221

    
222
    /**
223
     * Retrieve the length of the given column.
224
     *
225
     * @param inIndex DOCUMENT ME!
226
     *
227
     * @return DOCUMENT ME!
228
     */
229
    public int getFieldLength(int inIndex) {
230
        return myHeader.getFieldLength(inIndex);
231
    }
232

    
233
    /*
234
     * Retrieve the value of the given column as string.
235
     *
236
     * @param idField DOCUMENT ME!
237
     * @param idRecord DOCUMENT ME!
238
     *
239
     * @return DOCUMENT ME!
240
     *
241
             public Object getFieldValue(int idField, long idRecord) throws IOException {
242
                 Object[] tmpReg = getRecord(idRecord);
243
                 return tmpReg[idField];
244
             }
245
     */
246
    /*
247
     * DOCUMENT ME!
248
     *
249
     * @param idField DOCUMENT ME!
250
     * @param idRecord DOCUMENT ME!
251
     *
252
     * @return DOCUMENT ME!
253
     *
254
             public double getFieldValueAsDouble(int idField, int idRecord) throws IOException {
255
                 Object[] tmpReg = getRecord(idRecord);
256
                 return (double) Double.parseDouble(tmpReg[idField].toString());
257
             }
258
     */
259

    
260
    /**
261
     * Retrieve the location of the decimal point.
262
     *
263
     * @param inIndex DOCUMENT ME!
264
     *
265
     * @return DOCUMENT ME!
266
     */
267
    public int getFieldDecimalLength(int inIndex) {
268
        return myHeader.getFieldDecimalCount(inIndex);
269
    }
270

    
271
    /**
272
     * read the DBF file into memory.
273
     *
274
     * @param file DOCUMENT ME!
275
     *
276
     * @throws IOException DOCUMENT ME!
277
     */
278
    public void open(File file) throws IOException {
279
        /* if (file.canWrite()){
280
            raf = new RandomAccessFile(file, "rw");
281
            mode = FileChannel.MapMode.READ_WRITE;
282
        } else { */
283
            raf = new RandomAccessFile(file, "r");
284
            mode = FileChannel.MapMode.READ_ONLY;
285
        // } 
286
        channel = raf.getChannel();
287

    
288
        // buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
289
        buffer = new BigByteBuffer(channel, mode);
290

    
291
        // create the header to contain the header information.
292
        myHeader = new DbaseFileHeader();
293
        myHeader.readHeader(buffer);
294
    }
295

    
296
    /**
297
     * Removes all data from the dataset
298
     *
299
     * @throws IOException DOCUMENT ME!
300
     */
301
    public void close() throws IOException {
302
        raf.close();
303
        channel.close();
304
        buffer = null;
305
    }
306

    
307
    public FileChannel getWriteChannel() {
308
        return channel;
309
    }
310
}