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

23 respostas
C

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.

23 Respostas

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

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

C

Agradecido Digão, funcionou!

Rodrigo_Sasaki

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.

C

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

Rodrigo_Sasaki

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

Rodrigo_Sasaki

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

nel

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

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.

Rodrigo_Sasaki

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?

nel

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?

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.

C

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:

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

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:

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) {}
        }
    }

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 ?

C

Boa tarde Nel,

O erro persiste, como no trecho abaixo:

GERENTE DESENVOLVIMENTO DE NEGÃ?CIOS

Como eu devo proceder, para solucionar o mesmo?

C

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.

nel

cajubino:
Boa tarde Nel,

O erro persiste, como no trecho abaixo:

GERENTE DESENVOLVIMENTO DE NEGÃ?CIOS

Como eu devo proceder, para solucionar o mesmo?

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

ViniGodoy

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

C

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.

Rodrigo_Sasaki

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.

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

C

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

C

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.

nel

Não se trata de desconsiderar mas sim em melhora-lo, pois você precisa aplicar o unicode (ISO-8859-1) para gerar os caracteres especiais corretamente.
O diganeves apenas mostrou como você pode fazer isso, agora é adaptar a sua necessidade.

C

Perfeito Nel, agradecido.

Consegui resolver o que estava com dúvida, era referente como implementar um arquivo já criado, por exemplo:

arquivo = new File("S:/JUNHO-12/ACCIONA/04/ACCIONA2.txt"); fos = new FileOutputStream(arquivo);

Adicionando a valor true, ele não substitui o arquivo criado.

arquivo = new File("S:/JUNHO-12/ACCIONA/04/ACCIONA2.txt"); fos = new FileOutputStream(arquivo,true);

de qualquer forma, só precisaria saber como faço para pular linha agora com o método bw.write(string);

Agradeço Nel e Digão, desculpe-me pela ignorância.

C

Consegui Nel, obrigado.

Utilizei o método bw.newLine();

RESOLVIDO!

nel

Ignorância não tem relação alguma com isso. Chama-se “experiência” :slight_smile:
Joia ! Só edita o tópico e adiciona [Resolvido] ao fim dele, para facilitar ok?

Abraços.

Criado 4 de junho de 2012
Ultima resposta 5 de jun. de 2012
Respostas 23
Participantes 4