Eu gosto mais do tokenizers e para teus caracteres não mudarem, você tem usar o charset correto do arquivo de origem no método readLine() ,
no código abaixo eu to usando “ISO-8859-1” mas tem vários outros:
US-ASCII Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the Unicode character set
ISO-8859-1 ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1
UTF-8 Eight-bit UCS Transformation Format
UTF-16BE Sixteen-bit UCS Transformation Format, big-endian byte order
UTF-16LE Sixteen-bit UCS Transformation Format, little-endian byte order
UTF-16 Sixteen-bit UCS Transformation Format, byte order identified by an optional byte-order mark
String delimitadores = "|";
java.io.BufferedReader br = new java.io.BufferedReader(new java.io.FileReader(f.getPath(), ));
while ((sLinha = br.readLine("ISO-8859-1")) != null) {
java.util.StringTokenizer st = new java.util.StringTokenizer(sLinha, delimitadores, true);
while (st.hasMoreTokens()) {
arq.addListaPalavras(st.nextToken());
}
Quanto ao Split, não sei bem, mas ele tem sempre algumas coisas a ver com o tipo de caracter que se usa.
Algumas vezes é necessário usar \ no literal. Por isso não gosto muito dele.