Separar por meses um determinado periodo de data

Pessoal, se alguém puder me auxiliar.
Estou tentando fazer um processo aqui que é o seguinte.
O usuario entra com um determinado periodo de data.
Por exemplo: 01/01/2010 a 03/03/2010
Dentro deste intervalo preciso separar os intervalos de datas por meses, Exemplo.
1 - Periodo: 01/01/2010 a 31/01/2010
2 - Periodo: 01/02/2010 a 28/02//2010
3 - Periodo: 01/03/2010 a 03/03/2010

Um outro exemplo. Considerando o seguinte periodo inserido pelo usuario. 16/01/2010 a 21/03/2010
1 - Periodo: 16/01/2010 a 31/01/2010
2 - Periodo: 01/02/2010 a 28/02//2010
3 - Periodo: 01/03/2010 a 21/03/2010

E assim por diante, depende do periodo inserido pelo usuario. Considerando os dias bissexto tbm.
Alguém consegue me ajudar?
Obrigado…

https://docs.oracle.com/javase/7/docs/api/java/util/Date.html

Leia a documentação e veja como o month funciona, após entender isso é só criar uma lógica bem simples.

Pessoal, consegui. Portanto estou postando o codigo como contribuição para quem um dia precisar e ter a mesma dificuldade.

public static void main(String[] args) throws ParseException {

        String sdateInicio = "10/01/2010";
        String sdateFim = "02/03/2011";
        SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy");
       
        Date dateInicial = f.parse(sdateInicio);
        Date dateFinal = f.parse(sdateFim);
       
        int months = monthsBetweenDates(dateInicial,dateFinal);
       
        System.out.println(months);
       
       
        for (int i = 0; i < months; i++) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(dateInicial);
            calendar.add(Calendar.MONTH, i);
            if (i != 0) {
            	calendar.set(Calendar.DAY_OF_MONTH, 1);
			}
            Date dataInicialPeriodo = calendar.getTime();
            if (i != months -1) {
            	calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
			}else{
				Calendar x = Calendar.getInstance();
	            x.setTime(dateFinal);
				calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
				
				
				calendar.set(Calendar.DAY_OF_MONTH, x.get(Calendar.DAY_OF_MONTH));
				
			}
            Date dataFinalPeriodo = calendar.getTime();
            System.out.println("Data Inicial " + f.format(dataInicialPeriodo) + " - Data Final " + f.format(dataFinalPeriodo));
        }
    }
   
    public static int monthsBetweenDates(Date startDate, Date endDate){
 
        Calendar start = Calendar.getInstance();
        start.setTime(startDate);
        Calendar end = Calendar.getInstance();
        end.setTime(endDate);
 
          int monthsBetween = 0;
            int dateDiff = end.get(Calendar.DAY_OF_MONTH)-start.get(Calendar.DAY_OF_MONTH);      
            if(dateDiff<0) {
                int borrrow = end.getActualMaximum(Calendar.DAY_OF_MONTH);          
                 dateDiff = (end.get(Calendar.DAY_OF_MONTH)+borrrow)-start.get(Calendar.DAY_OF_MONTH);
                 monthsBetween--;
                 if(dateDiff>0) {
                     monthsBetween++;
                 }
            }
            else {
                monthsBetween++;
            }      
            monthsBetween += end.get(Calendar.MONTH)-start.get(Calendar.MONTH);      
            monthsBetween  += (end.get(Calendar.YEAR)-start.get(Calendar.YEAR))*12;      
            return monthsBetween;
     }
  }