diff --git a/src/main/java/net/iryndin/jdbf/core/DbfRecord.java b/src/main/java/net/iryndin/jdbf/core/DbfRecord.java index 88d57e7..bb064de 100644 --- a/src/main/java/net/iryndin/jdbf/core/DbfRecord.java +++ b/src/main/java/net/iryndin/jdbf/core/DbfRecord.java @@ -21,14 +21,17 @@ public class DbfRecord { private DbfMetadata metadata; private MemoReader memoReader; private Charset stringCharset; + private final int recordNumber; - public DbfRecord(byte[] source, DbfMetadata metadata, MemoReader memoReader) { + public DbfRecord(byte[] source, DbfMetadata metadata, MemoReader memoReader, int recordNumber) { + this.recordNumber = recordNumber; this.bytes = new byte[source.length]; System.arraycopy(source, 0, this.bytes, 0, source.length); this.metadata = metadata; this.memoReader = memoReader; } + /* public DbfRecord(DbfMetadata metadata) { this.metadata = metadata; fillBytesFromMetadata(); @@ -36,8 +39,9 @@ public DbfRecord(DbfMetadata metadata) { private void fillBytesFromMetadata() { bytes = new byte[metadata.getOneRecordLength()]; - BitUtils.memset(bytes, 0x20); + BitUtils.memset(bytes, JdbfUtils.EMPTY); } + */ public Charset getStringCharset() { return stringCharset; @@ -51,6 +55,10 @@ public byte[] getBytes() { return bytes; } + public int getRecordNumber() { + return recordNumber; + } + public String getString(String fieldName) { Charset charset = this.stringCharset; if (charset == null) { diff --git a/src/main/java/net/iryndin/jdbf/reader/DbfReader.java b/src/main/java/net/iryndin/jdbf/reader/DbfReader.java index cf1228d..181fe22 100644 --- a/src/main/java/net/iryndin/jdbf/reader/DbfReader.java +++ b/src/main/java/net/iryndin/jdbf/reader/DbfReader.java @@ -5,6 +5,7 @@ import net.iryndin.jdbf.util.IOUtils; import java.io.*; +import java.util.Arrays; public class DbfReader implements Closeable { @@ -12,6 +13,7 @@ public class DbfReader implements Closeable { private MemoReader memoReader; private DbfMetadata metadata; private byte[] oneRecordBuffer; + private int recordsCounter = 0; public DbfReader(File dbfFile) throws IOException { this(new FileInputStream(dbfFile)); @@ -61,10 +63,14 @@ private void readHeader() throws IOException { public void close() throws IOException { if (memoReader != null) { memoReader.close(); + memoReader = null; } if (dbfInputStream != null) { dbfInputStream.close(); + dbfInputStream = null; } + metadata = null; + recordsCounter = 0; } public void findFirstRecord() throws IOException { @@ -77,9 +83,10 @@ private void seek(ByteArrayInputStream inputStream, int position) { } public DbfRecord read() throws IOException { + Arrays.fill(oneRecordBuffer, (byte)0x0); int readLength = dbfInputStream.read(oneRecordBuffer); - if (readLength == -1) { + if (readLength < metadata.getOneRecordLength()) { return null; } @@ -87,6 +94,6 @@ public DbfRecord read() throws IOException { } private DbfRecord createDbfRecord() { - return new DbfRecord(oneRecordBuffer, metadata, memoReader); + return new DbfRecord(oneRecordBuffer, metadata, memoReader, ++recordsCounter); } } diff --git a/src/test/java/net/iryndin/jdbf/TestDbfReader.java b/src/test/java/net/iryndin/jdbf/TestDbfReader.java new file mode 100644 index 0000000..8ef392a --- /dev/null +++ b/src/test/java/net/iryndin/jdbf/TestDbfReader.java @@ -0,0 +1,68 @@ +package net.iryndin.jdbf; + +import net.iryndin.jdbf.core.DbfMetadata; +import net.iryndin.jdbf.core.DbfRecord; +import net.iryndin.jdbf.reader.DbfReader; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.text.ParseException; + +import static org.junit.Assert.assertEquals; + +public class TestDbfReader { + + @Test + public void test1() throws IOException, ParseException { + Charset stringCharset = Charset.forName("Cp866"); + + InputStream dbf = getClass().getClassLoader().getResourceAsStream("data1/gds_im.dbf"); + + DbfRecord rec; + try (DbfReader reader = new DbfReader(dbf)) { + DbfMetadata meta = reader.getMetadata(); + + assertEquals(5, meta.getRecordsQty()); + assertEquals(28, meta.getFields().size()); + + System.out.println("Read DBF Metadata: " + meta); + int recCounter = 0; + while ((rec = reader.read()) != null) { + rec.setStringCharset(stringCharset); + System.out.println(rec.getRecordNumber()); + System.out.println(rec.toMap()); + + recCounter++; + assertEquals(recCounter, rec.getRecordNumber()); + } + } + } + + @Test + public void test2() throws IOException, ParseException { + Charset stringCharset = Charset.forName("Cp866"); + + InputStream dbf = getClass().getClassLoader().getResourceAsStream("data1/tir_im.dbf"); + + DbfRecord rec; + try (DbfReader reader = new DbfReader(dbf)) { + DbfMetadata meta = reader.getMetadata(); + + assertEquals(1, meta.getRecordsQty()); + assertEquals(117, meta.getFields().size()); + + System.out.println("Read DBF Metadata: " + meta); + int recCounter = 0; + while ((rec = reader.read()) != null) { + rec.setStringCharset(stringCharset); + System.out.println(rec.getRecordNumber()); + System.out.println(rec.toMap()); + + recCounter++; + assertEquals(recCounter, rec.getRecordNumber()); + } + } + } +} diff --git a/src/test/java/net/iryndin/jdbf/TestMemo.java b/src/test/java/net/iryndin/jdbf/TestMemo.java index 1109a0d..0c41869 100644 --- a/src/test/java/net/iryndin/jdbf/TestMemo.java +++ b/src/test/java/net/iryndin/jdbf/TestMemo.java @@ -24,6 +24,7 @@ public void test1() { try (DbfReader reader = new DbfReader(dbf, memo)) { DbfMetadata meta = reader.getMetadata(); + System.out.println("Read DBF Metadata: " + meta); assertEquals(5, meta.getField("TEXVER").getLength()); assertEquals(DbfFieldTypeEnum.Character, meta.getField("TEXVER").getType()); diff --git a/src/test/resources/data1/gds_im.dbf b/src/test/resources/data1/gds_im.dbf new file mode 100644 index 0000000..2222aad Binary files /dev/null and b/src/test/resources/data1/gds_im.dbf differ diff --git a/src/test/resources/data1/tir_im.dbf b/src/test/resources/data1/tir_im.dbf new file mode 100644 index 0000000..235d23c Binary files /dev/null and b/src/test/resources/data1/tir_im.dbf differ