Peço a gentileza de vocês e agradeço quem puder me orientar a respeito de como efetuar uma leitura de um arquivo txt com caracteres especiais como: à,ü,ç e dentre outros.
Abaixo, segue algumas tentativas:
File f = new File("T:/ACCIONA/FASFASFAS.txt");
RandomAccessFile leitor = new java.io.RandomAccessFile(f, "r");
//Reader reader = new InputStreamReader(new FileInputStream("T:/ACCIONA/teste.txt"));
//ARUIVOS UTF-8
//BufferedReader leitor = new BufferedReader(reader);
FileReader reader = new FileReader("S:/JUNHO-12/ACCIONA/04/ACCIONA_PRODUCAO.txt");
BufferedReader leitor = new BufferedReader(reader);
Compreendi, no entanto, deparei-me com o seguinte erro:
A formatação só é aceita à partir do momento que eu executo o código novamente, ou seja, talvez seja pelo fato de não ter “fechado” o objeto.
Poderia me orientar quanto à estrutura do finally, como finalizar? Pois até então já havia finalizado o objeto leitor, mas pelo visto não é o suficiente.
Segue abaixo a estrutura informada para leitura do arquivo:
se quiser manter o código mais legível, você pode criar um método na sua classe para o fechamento dos Closeables. Algo assim: private static void close(Closeable closeable){
try{
if (closeable != null){
closeable.close();
}
} catch (IOException e){
e.printStackTrace();
}
}E ao invés de fazer isso } finally{
try{
if (bw != null)
bw.close();
if (osw != null)
osw.close();
if (fos != null)
fos.close();
} catch (IOException e){
e.printStackTrace();
}
} faz isso} finally{
close(bw);
close(osw);
close(fos);
}
[quote=digaoneves]Segue um exemplo: public static void write(String path, String str, String unicode){
BufferedWriter bw = null;
OutputStreamWriter osw = null;
FileOutputStream fos = null;
try{
File file = criarArquivo(path);
fos = new FileOutputStream(file);
osw = new OutputStreamWriter(fos, unicode);
bw = new BufferedWriter(osw);
bw.write(str);
} catch (IOException e){
e.printStackTrace();
} finally{
try{
if (bw != null)
bw.close();
if (osw != null)
osw.close();
if (fos != null)
fos.close();
} catch (IOException e){
e.printStackTrace();
}
}
}[/quote]
Na minha opinião, é a forma coerente e correta de trabalhar com I/O. Aconselho a usar após a escrita um flush() também. Todavia, é imprescindível executar os close em um bloco finally. Mesmo que não tenha o try-catch, assim:
public static void write(String path, String str, String unicode) throws IOException {
BufferedWriter bw = null;
OutputStreamWriter osw = null;
FileOutputStream fos = null;
try{
File file = criarArquivo(path);
fos = new FileOutputStream(file);
osw = new OutputStreamWriter(fos, unicode);
bw = new BufferedWriter(osw);
bw.write(str);
bw.flush();
} finally{
try{
if (bw != null)
bw.close();
if (osw != null)
osw.close();
if (fos != null)
fos.close();
} catch (IOException e){
e.printStackTrace();
}
}
}
Outra alteração que talvez possa ser feita, é ao invés de dar um writer é ler byte a byte antes de escrever. De toda forma, concorda plenamente com esse exemplo. cajubino, seu problema foi solucionado ? Senão, poste o código completo para analisarmos, em partes é mais difícil de verificar o contexto como um todo.
Só uma dúvida minha mesmo, por que usar o flush após a escrita? Existe algum erro conhecido que possa ocorrer caso o mesmo não seja invocado?[/quote]
Não necessariamente. O flush garante que tudo o que tu fez seja executado naquele momento e não em um momento posterior.
Imagine que você precise executar uma consulta ao arquivo que acabou de escrever, sem o flush tu não tem a garantia que ele realmente finalizou isso. É uma forma de “forçar” o término da escrita no arquivo.
Desde já agradeço a colaboração de vocês, porém ainda estou tentando compreender o funcionamento do código apresentado pelo Digão, pois até então, possuo conhecimentos relativamente básicos, no entanto, segue abaixo, o código completo:
Antes de mais nada, é fundamental seguir os padrões do Java. Métodos e pacotes devem começar com letra minúscula. Por sinal, sou contra usar qualquer letra maiúscula no package, ok ?
Porque não cria um objeto responsável por isso ao invés de usar métodos estáticos ? Mas enfim.
Sobre o seu método de leitura, preciso pensar com calma. Tu chama para salvar toda instante…preciso de uma reformulação.
o trecho acima, refere-se após gravar em um novo arquivo, porém se eu mandar apresentar na tela as informações, não há esse tipo de problema.
Referente ao “PularLinha” é o valor que passo para o método “SalvarTXT” e se por ventura o valor correspondente a string for igual ao mesmo, ele dará um println, pulando uma linha somente, não gravando o valor desta string no arquivo.
Ainda não apliquei o código apresentado e implementado por você, pois estava tentando compreender o funcionamento do mesmo, levando em consideração que no código citado há um método que desconheço seu funcionamento, refiro-me ao criarArquivo(path).
Ainda não apliquei o código apresentado e implementado por você, pois estava tentando compreender o funcionamento do mesmo, levando em consideração que no código citado há um método que desconheço seu funcionamento, refiro-me ao criarArquivo(path).
Como eu poderia implementar?
Agradecido novamente pelas informações.[/quote]
Ah, esse método é do exemplo que eu te mostrei, porque colei aqui um exemplo de uma classe que eu tenho. Ele simplesmente instancia um file e retorna, mas como eu tenho que concatenar umas Strings com umas constantes pra chegar no diretório que eu quero, joguei isso pra um método separado.
Segundo o meu código, haveria a necessidade de implementar o arquivo, uma vez que foi criado, ou seja, chamaria diversas vezes o método write, levando em consideração que ao chamá-lo ele irá criar um novo arquivo substituindo o anterior.