/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.util; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; import java.util.Iterator; /** * * <p> * Handy class to easily iterate over a file, line by line, using a Java 5 for * loop. * </p> * * @author Romain Pelisse <belaran@gmail.com> * */ public class FileIterable implements Iterable<String> { private LineNumberReader lineReader = null; public FileIterable(File file) { try { lineReader = new LineNumberReader(new FileReader(file)); } catch (FileNotFoundException e) { throw new IllegalStateException(e); } } @Override protected void finalize() throws Throwable { try { if (lineReader != null) { lineReader.close(); } } catch (IOException e) { throw new IllegalStateException(e); } super.finalize(); } @Override public Iterator<String> iterator() { return new FileIterator(); } class FileIterator implements Iterator<String> { private boolean hasNext = true; @Override public boolean hasNext() { return hasNext; } @Override public String next() { String line = null; try { if (hasNext) { line = lineReader.readLine(); if (line == null) { hasNext = false; line = ""; } } return line; } catch (IOException e) { throw new IllegalStateException(e); } } @Override public void remove() { throw new UnsupportedOperationException("remove is not supported by " + this.getClass().getName()); } } }