String em arquivo txt

22 respostas
Kassiane_Pretti

Olá pessoal

Tô com uma certa dificuldade de gravar uma string em um arquivo texto.
Segue o codigo abaixo:

try{

FileWriter out = new FileWriter("saida.txt");
BufferedWriter saida = new BufferedWriter(out);

//programa

saida.write(p1.toString());
out.close();
}

Desse jeito não grava nada… ¬¬
No caso não queria usar serialização ainda, pois ainda não entendi direito essa parte…
Gostaria de saber pq está dando errado, pois o Reader e Writer são para trabalhar com caracteres?
Mas agora estava pensando será que eu posso usar para string tb?

Desde já agradeço a atenção

Vlw \o/

22 Respostas

xandevieira

Tenta assim:

PrintWriter pw = new PrintWriter(diretorio);	
pw.write(string);
pw.flush();
pw.close();
Kassiane_Pretti

Era uma coisa dessas q eu estava procurando.
Mas tipo, eu queria q pulasse linha com o ‘\n’,
pois ele está presente na string.

Vlw \o/

xandevieira

Eu tenho que criar arquivo vindo de um string. No meu caso eu leio uma lista de objetos, faço um laço e adiciona num stringbuffer utilizando a quebra de linha \n, ao final eu gravo utilizando trecho q te passei.
Se explicar melhor seu caso talvez chegemos a uma solução.

Kassiane_Pretti

Codigo:

public String toString()
{
    return "matricula: " + matricula + "\n" + "Nome: " +  nome + "\n";
}

//Na classe principal eu tenho:

for(int i = 0; i<cont; i++)
{
         Professor p = cadas.get(i); //recupera o objeto
         saida.print(p.toString());
}

Saida no arquivo desejada:

matricula: 12345
Nome: Fulano de Tal

Mas a saida está desse modo:

matricula: 12345 Nome: Fulano de Tal

Lembrando q entre a matricula e nome temos o simbolo de quebra de linha.

Será q tem como fazer isso desse jeito q estou implementando?

Vlw pela atenção \o/

xandevieira

ja que seu toString() na classe professor ja retorna com quebra de linha, eu faria assim:

public String toString() {
	return "matricula: " + matricula + "\n" + "Nome: " +  nome + "\n";
}

//Na classe principal eu tenho:


PrintWriter pw = new PrintWriter(c:\temp\arquivo.txt);
StringBuffer stringBuffer = new StringBuffer();

for(int i = 0; i<cont; i++) {
	Professor p = cadas.get(i); //recupera o objeto
	stringBuffer.append(p.toString());
	
}

pw.write(stringBuffer.toString());
pw.flush();
pw.close();
>
Kassiane_Pretti

Hummm

Testei aqui e continua não saltando linha quando encontra o ‘\n’…

=\

Vlw \o/

xandevieira

Tentei simular seu caso:

public class Professor {
	
	private String matricula;
	private String nome;

	public String toString() {
	    return "matricula: " + matricula + "\n" + "Nome: " +  nome + "\n";
	}

	public String getMatricula() {
		return matricula;
	}

	public void setMatricula(String matricula) {
		this.matricula = matricula;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
}

public class UsaProfessor {

	/**
	 * @param args
	 * @throws FileNotFoundException 
	 */
	public static void main(String[] args) throws FileNotFoundException {
		 PrintWriter pw = new PrintWriter("c:\temp\arquivo.txt");  
		 StringBuffer stringBuffer = new StringBuffer();  
		 List<Professor> list = new ArrayList<Professor>();
		 for (int i  = 0;  i < 10; i++) {
			 Professor p = new Professor(); 
			 p.setMatricula(Integer.toString(i));
			 p.setNome("Nome"+i);
			 list.add(p);
		}
		 for(int i = 0; i<list.size(); i++) {  
		     Professor p = list.get(i); //recupera o objeto  
		     stringBuffer.append(p.toString());  
		 }  
		 pw.write(stringBuffer.toString());  
		 pw.flush();  
		 pw.close(); 
	}

}

olha meu arquivo gerado

matricula: 0
Nome: Nome0
matricula: 1
Nome: Nome1
matricula: 2
Nome: Nome2
matricula: 3
Nome: Nome3
matricula: 4
Nome: Nome4
matricula: 5
Nome: Nome5
matricula: 6
Nome: Nome6
matricula: 7
Nome: Nome7
matricula: 8
Nome: Nome8
matricula: 9
Nome: Nome9
>
Kassiane_Pretti

humm
Tá igual aqui, mas eu fiz assim no começo para abrir o arquivo:

FileWriter out = new FileWriter("saida1.txt");
            PrintWriter saida = new PrintWriter(out);

Será q influencia na hora de escrever no arquivo isso?

Vlw \o/

Kassiane_Pretti

Olha o codigo completo:

public class Simulacao
{
    public static void main (String args[])
    {

        try{
           
            FileWriter out = new FileWriter("saida1.txt");
            PrintWriter saida = new PrintWriter(out);
            
            BufferedReader ler = new BufferedReader(new InputStreamReader(System.in));

            StringBuffer stringBuffer = new StringBuffer();   
            
            Scanner sc = new Scanner(System.in);
            ProfDE p1 = new ProfDE();
            ProfHorista p2 = new ProfHorista();
            int length = 4, cont = 0;
            Cadastro cadas = new Cadastro(length);
            int op;

            do
            {
                System.out.println("Escolha:\n1- ProfDE\n2- ProfHorista\n3- Sair\n\n");
                op = sc.nextInt();

                switch(op)
                {
                    case 1:

                        System.out.println("Preencher os dados do ProfDE: ");

                        System.out.println("Entre com nome: ");
                        p1.setNome(ler.readLine());
                        System.out.println("Entre com a matricula: ");
                        p1.setMatricula(Integer.parseInt(ler.readLine()));
                        System.out.println("Entre com a carga horária: ");
                        p1.setCargaHoraria(Integer.parseInt(ler.readLine()));
                        System.out.println("Entre com o salário: ");
                        p1.setSalario(Double.parseDouble(ler.readLine()));
                        System.out.println(p1.toString());
                        cadas.insere(p1); cont++;
                        break;

                    case 2:

                        System.out.println("Preencher os dados do ProfHorista: ");

                        System.out.println("Entre com nome: ");
                        p2.setNome(ler.readLine());
                        System.out.println("Entre com a matricula: ");
                        p2.setMatricula(Integer.parseInt(ler.readLine()));
                        System.out.println("Entre com a carga horária: ");
                        p2.setCargaHoraria(Integer.parseInt(ler.readLine()));
                        System.out.println("Entre com o salário Hora: ");
                        p2.setSalarioHora(Double.parseDouble(ler.readLine()));
                        System.out.println(p2.toString());
                        cadas.insere(p2); cont++;
                        break;
                }
            }while(op != 3 && cont < length);
            
            for(int i = 0; i<cont; i++)
            {
                Professor p = cadas.get(i);
                stringBuffer.append(p.toString());  
                  
            }

            saida.write(stringBuffer.toString());
            saida.flush();
            saida.close();
            out.close();
            
        }
        
        catch (IOException e){ System.out.println(e); }
        
        catch(IndexOutOfBoundsException e){ System.out.println(e); }
        
        catch(IllegalArgumentException e){ System.out.println(e); }
        
        catch(NullPointerException e){ System.out.println(e); }
        
        catch(IllegalStateException e){ System.out.println(e); }
    }
}

? :?

xandevieira

Oi, nesse

System.out.println(p1.toString());  
System.out.println(p2.toString());

linha 41 e 57 imprime com quebra de linha?

xandevieira

agora que percebi, esse

ProfDE p1 = new ProfDE();
ProfHorista p2 = new ProfHorista();

extende Professor? Como ta a implementacao disso?

Kassiane_Pretti

Quando eu chamo o método toString no programa imprime com quebra de linha sim, só quando manda imprimir no arquivo q não vai…

Mutio estranho isso…

xandevieira

veja meu ultimo post.

seria bom vc rever isto
[quote]
Cadastro cadas = new Cadastro(length);
ProfDE p1 = new ProfDE();
ProfHorista p2 = new ProfHorista();
System.out.println(p1.toString());
System.out.println(p2.toString());
Professor p = cadas.get(i);
[code]

Kassiane_Pretti

avsouza:
agora que percebi, esse

ProfDE p1 = new ProfDE();
ProfHorista p2 = new ProfHorista();

extende Professor? Como ta a implementacao disso?

Apresenta apenas alguns métodos a mais, e tipo no método toString() temos a chamada para o método toString de professor assim:

public String toString()
{
      return super.toString() + "\n" + "salario: " + salario;
}

Mas não consigo ver o esteja de errado, pois quando imprime em tempo de excução tem as quebras de linhas certas
será q é só na hora de gravar q acontece isso?

=\

Vlw \o/

T

Use um outro editor de texto que não o Notepad (Bloco de Notas) para visualizar o arquivo gerado.

O Notepad é estúpido, ele só reconhece quebras de linhas se você usar “\r\n”, não “\n”.

Kassiane_Pretti

Mas isso só em java?
Pq em C nunca tive problemas com o “\n”

Vlw \o/

xandevieira

thingol:
Use um outro editor de texto que não o Notepad (Bloco de Notas) para visualizar o arquivo gerado.

O Notepad é estúpido, ele só reconhece quebras de linhas se você usar “\r\n”, não “\n”.

poxa, testei com notepad e realmente saiu sem a quebra, eta editorzinho fulero.
eu sempre utilizei o textpad como editor de texto.

Kassiane_Pretti

Poxa valeu msm Thingol…

Mas poxa passei minha tarde toda tentando descobrir
o erro e nada…
Puts e era uma coisa tão ridicula ¬¬

Vlw…

Problema resolvido…

Agora tenho q começar a implentar a recuperação dos dados no arquivo.

Mas me responde uma coisa, para recuperar os dados
do Notepad tem algum outro detalhe q nem esse do
“\n”? Pois vou continuar usando ele para os testes e não
gostaria de perder mais tempo com coisas mininas assim.

Obrigadinha \o/

xandevieira

a principio nao,

tenho este codigo para o q vc quer.
assumindo que seja para ler este arquivo de professores.

FileReader reader = new FileReader("seu arquivo");
		BufferedReader leitor = new BufferedReader(reader);
		leitor.readLine();
		String linha = null;
		while ((linha = leitor.readLine()) != null) {
			...
		}
		leitor.close();
xandevieira

ou assim:

File f = new File(arquivo);
	if (!f.exists()) {
		System.exit(-1);
	}
	try {
		BufferedReader in = new BufferedReader(new FileReader(f));
		String line;
		int lineCount = 0;
		while ((line = in.readLine()) != null) {
			StringTokenizer token = new StringTokenizer(line, " ");
			while (token.hasMoreElements()) {
				SeuObjeto obj = new SeuObjeto;
				obj .set...(Integer.parseInt(token.nextToken().trim()));
				...
			}
		}
T

KassiPretti:
Mas isso só em java?
Pq em C nunca tive problemas com o “\n”

Vlw \o/

Vamos explicar direitinho por que é que você nunca teve problemas com o C. É que se você usar fopen (“nome.do.arquivo”, “wt”), por exemplo, para criar um arquivo (pode ser também fopen (“nome.do.arquivo”, “w”), mas não fopen (“nome.do.arquivo”, “wb”)), o C converte tudo que é “\n” para “\r\n” na escrita (e na leitura ele faz a “desconversão”, ou seja, “fgets()” transforma “\r\n” para “\n”. É um comportamento esquisito que dá problemas de incompatibilidade com o Unix.

Em Java, para você ter o mesmo comportamento, você não deveria usar “\n”; em vez disso, você pode usar:

println ou
printf ("%n")

Não é muito adequado escrever explicitamente “\n” no Java para tentar pular linhas. Use println ou printf ("%n").

Kassiane_Pretti

Nossa!!! Muito bom Thingol…
avsouza vou tentar aqui e qq coisa eu pergunto aqui de novo…

Vcs foram me ajudaram muito… Muito Obrigada

Vlw \o/

Criado 16 de setembro de 2008
Ultima resposta 16 de set. de 2008
Respostas 22
Participantes 3