Puedes crearte dos variables para saberlo. tmp y tmpant. en cada recorrido del bucle cambias su valor. tmpant por el valor que tenia tmp, y tmp por el siguiente valor.
Cuando sean distintas, habras cambiado de jerarquia de nodo, y por tanto deberas cerrarlo.
Código:
int j=0;
while (j<lista.size())
{
tmpant = tmp;
tmp = lista.get(j).split("\\.");
for(int k=1;k<tmp.length;k++)//hacer las respectivas tabulaciones
textOut.write("\t");
if (tmpant.length > 0 && tmp.length != tmpant.length) //si son distintos es que estamos en otro nodo. eltmpant.length>0 sirve para que no entre la primera vez que pasa por el bucle (j=0)
{
textOut.write("</sub"+tmpant.length+">");
}
textOut.write("<sub"+tmp.length+">");
textOut.write(tmp[tmp.length-1]);//escribir solo el hijo
textOut.write("\n");
j++;
}
textOut.write("</carpeta>");
Pd. Lo he hecho con un while, pero daria igual con tu for.