I would either go with Picard's VCFFileReader for single threaded ops (http://picard.sourceforge.net/javadoc/org/broadinstitute/variant/vcf/VCFFileReader.html) or Hadoop-BAM's VCFInputFormat for Spark jobs.