/*
* Copyright (c) 2002 Cunningham & Cunningham, Inc.
* Copyright (c) 2009-2015 by Jochen Wierum & Cologne Intelligence
*
* This file is part of FitGoodies.
*
* FitGoodies is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* FitGoodies is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with FitGoodies. If not, see <http://www.gnu.org/licenses/>.
*/
package de.cologneintelligence.fitgoodies.file.readers;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.regex.Pattern;
/**
* Reader which is capable to process char-delimited files.
*/
public class DelimiterRecordReader implements FileRecordReader {
private String[] parts;
private int partIndex;
private final String delimiter;
private final BufferedReader reader;
/**
* Creates a new reader object.
*
* @param bufferedReader underlying stream to process
* @param fieldDelimiter field delimiter character
* @throws IOException thrown if <code>bufferedReader</code> reports a problem
*/
public DelimiterRecordReader(final BufferedReader bufferedReader,
final String fieldDelimiter) throws IOException {
delimiter = fieldDelimiter;
this.reader = bufferedReader;
nextRecord();
}
@Override
public final String nextField() {
if (parts == null || partIndex >= parts.length) {
return null;
}
String returnValue = parts[partIndex];
++partIndex;
return returnValue;
}
@Override
public final boolean nextRecord() throws IOException {
String line;
line = reader.readLine();
if (line == null) {
parts = null;
return false;
}
parts = line.split(Pattern.quote(delimiter));
partIndex = 0;
return true;
}
@Override
public void close() throws IOException {
reader.close();
}
@Override
public final boolean canRead() {
return parts != null;
}
}