package net.sf.cram.cg; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import htsjdk.samtools.util.CloseableIterator; import org.apache.tools.bzip2.CBZip2InputStream; class EvidenceRecordFileIterator implements CloseableIterator<EvidenceRecord> { private BufferedReader reader; private EvidenceRecord cachedRecord; String assembly_ID; String chromosome; String sample; String generatedAt; String line; long counter = 0; EvidenceRecordFileIterator(File file) throws FileNotFoundException, IOException { InputStream is = new FileInputStream(file); // have to skip first two bytes due to some apache bzip2 peculiarity: is.read(); is.read(); reader = new BufferedReader(new InputStreamReader(new CBZip2InputStream(is))); readHeader(); readNext(); }; private void readHeader() { try { while ((line = reader.readLine()) != null) { if (line.startsWith(">")) return; if (line.length() == 0) continue; if (line.startsWith("#")) { String[] words = line.split("\\t"); if (words.length != 2) throw new RuntimeException("File header format error."); if ("#ASSEMBLY_ID".equals(words[0])) { assembly_ID = words[1]; } else if ("#CHROMOSOME".equals(words[0])) { chromosome = words[1]; } else if ("#SAMPLE".equals(words[0])) { sample = words[1]; } else if ("#GENERATED_AT".equals(words[0])) { generatedAt = words[1]; } } } } catch (Exception e) { throw new RuntimeException(e); } } private void readNext() { cachedRecord = null; try { while ((line = reader.readLine()) != null) { counter++; cachedRecord = EvidenceRecord.fromString(line); break; } } catch (Exception e) { throw new RuntimeException(e); } } @Override public boolean hasNext() { return cachedRecord != null; } EvidenceRecord peek() { return cachedRecord; } @Override public EvidenceRecord next() { EvidenceRecord next = cachedRecord; readNext(); return next; } @Override public void remove() { throw new RuntimeException("Remove not supported."); } @Override public void close() { if (reader != null) try { reader.close(); } catch (IOException e) { throw new RuntimeException(e); } } }