Veo solo soluciones aquí pero no una explicación completa del problema, así que decidí publicar esta respuesta
Problema
Necesitas saber algunas cosas sobre text.split(delim). splitmétodo:
- acepta como argumento la expresión regular (regex) que describe el delimitador en el que queremos dividir,
- if
delimexiste al final de textlike en a,b,c,,(donde está el delimitador ,) splital principio creará una matriz como, ["a" "b" "c" "" ""]pero como en la mayoría de los casos no necesitamos estas cadenas vacías finales, también las elimina automáticamente para nosotros. Entonces crea otra matriz sin estas cadenas vacías finales y la devuelve .
También necesita saber que el punto. es un carácter especial en expresiones regulares . Representa cualquier carácter (excepto los separadores de línea, pero esto se puede cambiar con una Pattern.DOTALLbandera).
Entonces, para cadenas como "abc"si dividiéramos el "." splitmétodo,
- crear una matriz como
["" "" "" ""],
- pero dado que esta matriz contiene solo cadenas vacías y todas están al final, se eliminarán (como se muestra en el segundo punto anterior)
lo que significa que obtendremos como resultado una matriz vacía [](sin elementos, ni siquiera una cadena vacía), por lo que no podemos usar fn[0]porque no hay índice 0.
Solución
Para resolver este problema, simplemente necesita crear una expresión regular que represente un punto. Para hacerlo, tenemos que escapar de eso .. Hay pocas maneras de hacerlo, pero más sencilla es probablemente usando \(que en la cadena necesita ser escrita como "\\"porque \también es especial y no requiere otro \que se escapó).
Entonces, la solución a su problema puede parecer
String[] fn = filename.split("\\.");
Prima
También puedes usar otras formas de escapar de ese punto como
- usando la clase de personaje
split("[.]")
- envolviéndolo en una cita
split("\\Q.\\E")
- usando la instancia de patrón adecuada con
Pattern.LITERALbandera
- o simplemente use
split(Pattern.quote("."))y deje que regex se escape por usted.