Java: String split (): quiero que incluya las cadenas vacías al final

Tengo la siguiente cadena:

String str = "\nHERE\n\nTHERE\n\nEVERYWHERE\n\n"; 

Si acaba de imprimir esto, se mostraría así (por supuesto, \n no se imprimiría “literalmente”):

 \n HERE\n \n THERE\n \n EVERYWHERE\n \n \n 

Cuando llamo al método split("\n") , quiero obtener todas las cadenas entre los caracteres de la nueva línea ( \n ), incluso cadenas vacías al final.

Por ejemplo, si hago esto hoy:

 String strArray[] = str.split("\n"); System.out.println("strArray.length - " + strArray.length); for(int i = 0; i < strArray.length; i++) System.out.println("strArray[" + i + "] - \"" + strArray[i] + "\""); 

Quiero que se imprima así (Salida A):

 strArray.length - 8 strArray[0] - "" strArray[1] - "HERE" strArray[2] - "" strArray[3] - "THERE" strArray[4] - "" strArray[5] - "EVERYWHERE" strArray[6] - "" strArray[7] - "" 

Actualmente, se imprime así (Salida B) y se omiten las cadenas vacías que terminan:

 strArray.length - 6 strArray[0] - "" strArray[1] - "HERE" strArray[2] - "" strArray[3] - "THERE" strArray[4] - "" strArray[5] - "EVERYWHERE" 

¿Cómo hago para que el método split() incluya las cadenas vacías como en el resultado A? Yo, por supuesto, podía escribir un código de varias líneas, pero quería saber, antes de perder el tiempo tratando de implementarlo, si había un método simple o unas dos o más líneas de código para ayudarme. ¡Gracias!

use str.split("\n", -1) (con un argumento de limit negativo). Cuando a split se le da cero o ningún argumento de limit descarta los campos vacíos, y cuando se le da un argumento de limit positivo limita el número de campos a ese número, pero un límite negativo significa permitir cualquier número de campos y no descartar los campos vacíos . Esto está documentado aquí y el comportamiento se toma de Perl.

El método de división de un argumento se especifica para ignorar las divisiones de cadena vacías posteriores, pero la versión que toma un argumento de “límite” las conserva, por lo que una opción sería usar esa versión con un límite grande.

 String strArray[] = str.split("\n", Integer.MAX_VALUE); 

Personalmente, me gusta la utilidad Guava para dividir:

 System.out.println(Iterables.toString( Splitter.on('\n').split(input))); 

Luego, si desea configurar el comportamiento de cadena vacía, puede hacerlo:

 System.out.println(Iterables.toString( Splitter.on('\n').omitEmptyStrings().split(input)));