From 0ccea6c968363d3d1936bbc24687382b1804c5bc Mon Sep 17 00:00:00 2001 From: Dennis Schafroth Date: Mon, 9 Jan 2012 17:20:14 +0100 Subject: [PATCH] Move the reading of the leader into hasNext. Otherwise next() might fail. Considering alternative... --- src/org/marc4j/MarcStreamReader.java | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/org/marc4j/MarcStreamReader.java b/src/org/marc4j/MarcStreamReader.java index 9b6f637..3abfc1e 100644 --- a/src/org/marc4j/MarcStreamReader.java +++ b/src/org/marc4j/MarcStreamReader.java @@ -85,6 +85,7 @@ public class MarcStreamReader implements MarcReader { private boolean setBadIndicators = true; + byte[] leaderBuffer; /** * Constructs an instance with the specified input stream. */ @@ -108,8 +109,18 @@ public class MarcStreamReader implements MarcReader { * Returns true if the iteration has more records, false otherwise. */ public boolean hasNext() { - try { - if (input.available() == 0) + int available; + try { + available = input.available(); + try { + leaderBuffer = new byte[24]; + input.readFully(leaderBuffer); + } catch (EOFException eof) { + // If we are not capable of reading the leader before EOF, we cannot read a record + // This happens when we read gzipped marc files, that it returns available bytes, but none is present + available = 0; + } + if (available == 0) return false; } catch (IOException e) { throw new MarcException(e.getMessage(), e); @@ -127,14 +138,10 @@ public class MarcStreamReader implements MarcReader { record = factory.newRecord(); try { - - byte[] byteArray = new byte[24]; - input.readFully(byteArray); - - int recordLength = parseRecordLength(byteArray); + int recordLength = parseRecordLength(leaderBuffer); byte[] recordBuf = new byte[recordLength - 24]; input.readFully(recordBuf); - parseRecord(record, byteArray, recordBuf, recordLength); + parseRecord(record, leaderBuffer, recordBuf, recordLength); return(record); } catch (EOFException e) { -- 1.7.10.4