Estranho, o ResultSet, foi feito para isso "navegar" entre os registros.
Um exemplo:
ResultSet rs = null;
Statement st = SeuMetodoConector().createStatement();
rs = st.executeQuery("select * from teste");
//por default o rs, já está na primeira posição, ou melhor, uma posição atrás da primeira.
rs.first(); //pula para a primeira
rs.next(); //pula para o proximo
rs.previous(); //volta um registro
rs.last(); //vai para o fim
rs.beforeFirst(); // volta ao inicio..
Dentre outros métodos. Leia a documentação do resultSet, e aprenda melhor.
a continuação do programa seria (considerando, que cada método da navegação, retorna um boolean, true se existe registro na atual posição do resultset, false se não.
while (rs.next()) {
System.out.println("Lendo registro: "+rs.getString("ColumnTest");
}
System.out.println("Fim dos registros");