[RESOLVIDO] Ler arquivos em txt em ascii com caracteres especiais

Boa tarde,

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);

Desde já agradeço.

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

Ja tentou algo assim? Lembrando que file é o seu arquivo.

Agradecido Digão, funcionou!

Sem problemas, mas lembre-se que no exemplo há uma falha.

Eu não estou fechando nenhum dos readers ao final da leitura, você pode querer fazer isso em um bloco finally ou em algum outro momento.

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:

BufferedReader leitor = new BufferedReader(new InputStreamReader(new FileInputStream("T:/ACCIONA/Modelo.txt"), "ISO-8859-1")); do{ ... ... }while(linha!=null); leitor.close();

Para gravar em um arquivo, estou utilizando o seguinte código:

FileWriter writer = new FileWriter("T:/ACCIONA/teste.txt",true); PrintWriter saida = new PrintWriter(writer); ... ... saida.close(); writer.close();

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(); } } }

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.

Abraço.

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?

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.

Bom dia Nel e Digão,

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:

[code]
package ACCIONA;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.io.Reader;
import javax.swing.JOptionPane;

/**
*

  • @author eduardo
    */
    public class Principal {

    public static void main(String[] args) {
    LerTXT();
    }

    public static void LerTXT() {
    try {
    BufferedReader leitor = new BufferedReader(new InputStreamReader(new FileInputStream(“S:/JUNHO-12/ACCIONA/04/ACCIONA_PRODUCAO.txt”), “ISO-8859-1”));
    //FileReader reader = new FileReader(“S:/JUNHO-12/ACCIONA/04/ACCIONA_PRODUCAO.txt”);
    //BufferedReader leitor = new BufferedReader(reader);
    //boolean inicio = true;
    //boolean dois = true;
    int cont = 1;
    int cont2 = 0;
    while (leitor.ready()) {
    String string = leitor.readLine();
    if (“1”.equals(string.substring(0, 1))) {
    SalvarTXT(string);
    } else if (“2”.equals(string.substring(0, 1))) {
    SalvarTXT(string.substring(2, 6)); //codigo
    SalvarTXT(string.substring(6, 12)); //referencia
    SalvarTXT(string.substring(12, 42)); //descricao
    if (“D”.equals(string.substring(1, 2))) {
    SalvarTXT(" “); //valor proventos
    SalvarTXT(string.substring(42, 52)); //valor descontos
    } else if (“P”.equals(string.substring(1, 2))) {
    SalvarTXT(string.substring(42, 52)); //valor proventos
    SalvarTXT(” “); //valor descontos
    }
    cont2++;
    } else if (“3”.equals(string.substring(0, 1))) {
    if(string.length()<737){
    while(string.length()<737)
    string=string+” “;
    }
    while(cont2<30){
    SalvarTXT(” ");
    cont2++;
    }
    SalvarTXT(string);
    String contador = Integer.toString(cont);
    while (contador.length() < 6) {
    contador = “0” + contador;
    }
    SalvarTXT(contador);
    cont++;
    cont2=0;
    SalvarTXT(“PularLinha”);
    }
    }
    //reader.close();
    leitor.close();
    } catch (Exception er) {
    JOptionPane.showMessageDialog(null, “ERRO” + er);
    }
    }

    public static void SalvarTXT(String string) {
    try {
    FileWriter writer = new FileWriter(“S:/JUNHO-12/ACCIONA/04/ACCIONA2.txt”, true);
    PrintWriter saida = new PrintWriter(writer);

         if (!("PularLinha".equals(string))) {
             saida.print(string);
         } else {
             saida.println();
         }
         saida.close();
         writer.close();
    
     } catch (Exception err) {
         JOptionPane.showMessageDialog(null, "ERRO SalvarTXT" + err);
     }
    

    }
    }[/code]

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 ?

Seu método salvar:

[code]public static void salvarTXT(String string) {
FileWriter writer = null;
PrintWriter saida = null;
try {
writer = new FileWriter(“S:/JUNHO-12/ACCIONA/04/ACCIONA2.txt”, true);
saida = new PrintWriter(writer);

        if (!("PularLinha".equals(string))) {  
            saida.print(string);  
        } else {  
            saida.println();  
        }  
        
        saida.flush();
        writer.flush();
    } catch (Exception err) {  
        JOptionPane.showMessageDialog(null, "ERRO SalvarTXT" + err);  
    } finally {
       try {
        if (null != saida)
            saida.close();
        if (null != writer)
           writer.close();
        } catch(IOException io) {}
    }
}  [/code]

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.

E o “PularLinha” tu escreveu em seu TXT ?

Boa tarde Nel,

O erro persiste, como no trecho abaixo:

GERENTE DESENVOLVIMENTO DE NEGÃ?CIOS

Como eu devo proceder, para solucionar o mesmo?

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.

[quote=cajubino]Boa tarde Nel,

O erro persiste, como no trecho abaixo:

GERENTE DESENVOLVIMENTO DE NEGÃ?CIOS

Como eu devo proceder, para solucionar o mesmo?[/quote]

Aplicaou a solução que o digaoneves apresentou e eu só adicionei uma linha (flush) a mais ?

Por favor, ao postar tópicos, não use SOMENTE LETRAS MAIÚSCULAS no título.

Boa tarde Nel,

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=cajubino]Boa tarde Nel,

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.

pode substituir por um new File() heheheh

Ao utilizar o método write, desconsidero o método que eu havia criado? Refiro-me ao SalvarTXT.

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.