Skip to content

Instantly share code, notes, and snippets.

@koduki
Created April 7, 2012 17:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save koduki/2330766 to your computer and use it in GitHub Desktop.
Save koduki/2330766 to your computer and use it in GitHub Desktop.
BufferedReaderのIterableラッパー. 最終行の判定ができるのでCSVのヘッダーやフッターをとるのに便利.
package utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Iterator;
/**
* BufferedReader Iterable Wrapper.
*
* @author koduki
*
*/
public class ReaderIterator implements Iterator<String>, Iterable<String> {
private BufferedReader bufferedReader;
private String line;
private boolean doneNext = false;
private int firstCheckCounter = 0;
/**
* constructor.
* @param reader target reader.
*/
public ReaderIterator(BufferedReader bufferedReader) {
super();
this.bufferedReader = bufferedReader;
}
/**
* constructor.
* @param reader target reader.
*/
public ReaderIterator(Reader reader) {
this(new BufferedReader(reader));
}
@Override
public boolean hasNext() {
boolean result = false;
try {
if (!this.doneNext) {
this.line = this.bufferedReader.readLine();
this.doneNext = true;
}
result = (line != null);
} catch (IOException e) {
return false;
}
return result;
}
@Override
public String next() {
String result = null;
if (this.hasNext()) {
result = this.line;
}
this.doneNext = false;
if (firstCheckCounter <= 1) {
this.firstCheckCounter += 1;
}
return result;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
/**
* return this instance.
* @return this instance.
*/
@Override
public Iterator<String> iterator() {
return this;
}
/**
* if first line, return true.
* @return true is first line.
*/
public boolean isFirst() {
return (firstCheckCounter == 1);
}
/**
* if last line, return true.
* @return true is last line.
*/
public boolean isLast() {
return (this.hasNext() == false);
}
}
package utils;
import static org.junit.Assert.*;
import java.io.BufferedReader;
import java.io.StringReader;
import java.util.Arrays;
import java.util.Iterator;
import org.junit.Test;
public class ReaderIteratorTest {
@Test
public void testIterator() {
BufferedReader br = new BufferedReader(new StringReader("header\nbody1\nbody2\nfooter"));
Iterator<String> expecteds = Arrays.asList("header", "body1", "body2","footer").iterator();
for (ReaderIterator iterator = new ReaderIterator(br); iterator.hasNext();) {
assertEquals(expecteds.next(), iterator.next());
}
assertFalse(expecteds.hasNext());
}
@Test
public void testIterable() {
BufferedReader br = new BufferedReader(new StringReader("header\nbody1\nbody2\nfooter"));
Iterator<String> expecteds = Arrays.asList("header", "body1", "body2", "footer").iterator();
ReaderIterator iterator = new ReaderIterator(br);
for (String line : iterator) {
assertEquals(expecteds.next(), line);
}
assertFalse(expecteds.hasNext());
}
@Test
public void testHeaderAndFooter() {
boolean doneFirst = false;
boolean doneLast = false;
Iterator<String> expecteds = Arrays.asList("body1", "body2").iterator();
ReaderIterator iterator = new ReaderIterator(new StringReader("header\nbody1\nbody2\nfooter"));
for (String line : iterator) {
if (iterator.isFirst()) {
assertEquals("header", line);
doneFirst = true;
} else if (iterator.isLast()) {
assertEquals("footer", line);
doneLast = true;
} else {
assertEquals(expecteds.next(), line);
}
}
assertFalse(expecteds.hasNext());
assertTrue(doneFirst);
assertTrue(doneLast);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment