[RESOLVIDO]Problema com String.split

Pessoal, eu tenho a seguinte String

String texto ="2|wilson moraes|(062)3434-8485|rua 1040 st. pedro ludovico"

e gostaria de quebrar essa string cada vez que houver um [color=darkred]|[/color]
pra isso, eu to usando o método split, e uso da seguinte maneira:

String[] teste = texto.split("|");

só que, na verdade ele quebra pra mim em letras, vem algo do tipo
2
w
i
l
s
o
n

eu tentei usar o StringTokenizer , só que se por exemplo dentro da minha string existisse um João Ele me traz: Jo�o

Alguém, sabe me dizer oque estou fazendo de errado ?

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.

João, não consegui alterar o charset, conforme vc mostrou na linha

while ((sLinha = br.readLine("ISO-8859-1")) != null) {  
split("\|");

Olá!

O método split tem uma particularidade que muitos não sabem: O método split() trabalha com expressões regulares.
Veja em http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html para maiores informações.

Quanto ao teu erro, tenta fazer assim:

String[] txts = texto.split("[|]");

Fiz um teste com split, realmente tem que usar:

String[] teste = texto.split("\\|"); 

para funcionar do jeito que você quer.

Valeu João, fazendo assim

String[] testatk = line.split("\\|");

realmente corrigiu meu erro…

Agora gostaria muito de usar o StringToken, mais aquele problema com caractere me impede… =\

O charset é definido na hora de salvar o arquivo. Tipo:

String pathArquivo = "fileenconding.txt"; BufferedWriter bufferedWriter = new BufferedWriter( new OutputStreamWriter(new FileOutputStream(pathArquivo), Charset.forName("US-ASCII"))); bufferedWriter.write("çãéü"); bufferedWriter.close(); BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(pathArquivo), Charset.forName("US-ASCII"))); System.out.println(reader.readLine()); reader.close();
Se tu rodar esse código, a saída vai ser:
???

Agora se tu usar o charset ISO-8859-1, a saída é exibida corretamente:

String pathArquivo = "fileenconding.txt"; BufferedWriter bufferedWriter = new BufferedWriter( new OutputStreamWriter(new FileOutputStream(pathArquivo), Charset.forName("ISO-8859-1"))); bufferedWriter.write("çãéü"); bufferedWriter.close(); BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(pathArquivo), Charset.forName("ISO-8859-1"))); System.out.println(reader.readLine()); reader.close();

Tudo vai depender do charset do arquivo. Se ele for ASCII nem adianta ler como ISO-8859-1 que o texto do arquivo não vai ser lido direito.

[quote=wilsontads]João, não consegui alterar o charset, conforme vc mostrou na linha

while ((sLinha = br.readLine("ISO-8859-1")) != null) {  

Nao entendi!!!

Como assim, não conseguiu alterar o charset???

É só trocar um String que representa um charSet por outra e ir testando pra ver qual funciona.

Dias atrás tive um problema, colocava o charSet no readLine e não funcionava.

Daí tentei colocar ele no InputStreamReader (ou algo assim) e funcionou perfeitamente.

Interessante, vivendo e aprendendo.

Já usei várias vezes os charSets mas nunca usei esse método forName:

Charset.forName(“ISO-8859-1”)

sempre usava diretamente, só colocando entre aspas no segundo argumento do readLine ou do InputStreamReader.

matheuslmota meu BufferedReader ficou da seguinte forma:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), Charset.forName("ISO-8859-1")));

Quando executei, exibiu o caractere normalmente… ou seja, funcionou…
e a solução pro split, ficou do jeito que o João disse…
de qualquer forma, obg à todos.

Só ressuscitando o tópico, eu voltei a ter problemas…
como dito anteriormente,eu passei a usar o StringTokenizer,
só que ela tava me dando muita dor de cabeça, dando altos paus,
ai fui ver no site da sun, e a mesma aconselha usar o split da string, ao invés do StringTokenizer.
porém, antes eu fazia algo do tipo .split("\|");
e dava certo…
o problema é que, eu pretendo armazenar o split em uma variável, por exemplo:

[code]String texto="“001|cliente1|cidade1|estado1"”;
String spliter= “|”;
String[] teste = texto.split("\"+spliter);
//ou
String[] teste = texto.split("["+spliter+"]");
/*java.util.regex.PatternSyntaxException: Unclosed character class near index 1 []
quando uso []
e
java.util.regex.PatternSyntaxException: Unexpected internal error near index 1^
quando uso o \

*/[/code]

Na verdade, a String texto, que to tendo problemas é a seguinte:

"ome 5|5555-5555|rua 5"

Isso é relativamente fácil. Use Pattern.quote:

String padrao = "|";
String texto = "ome 5|5555-5555|rua 5" ;
String[] campos = texto.split (Pattern.quote (padrao));

http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#quote(java.lang.String)

Teoricamente talvez funcione…
na prática ele retorna um vetor de tamanho 1, contendo a string texto

O programa abaixo:

import java.util.regex.*;

class TesteSplit {
    public static void main(String[] args) {
        String padrao = "|";
        String texto  = "abacaxi|abacate|abobrinha";
        String[] campos;
        campos = texto.split (Pattern.quote (padrao));
        for (String s : campos) {
            System.out.println (s);
        }
    }
}

Imprime corretamente:

abacaxi
abacate
abobrinha

Realmente, eu estava fazendo o seguinte:

campos = texto.split (Pattern.quote ("\\"+padrao));