Erro de IO no FlieWriter?

Pessoal,

Coloquei esta função em um botão para gerar um txt, pegando do tutorial daqui:

bConfirmar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { FileWriter out = new FileWriter("C:\arquivo.txt"); out.write("Paulinho relembrando Java fodasticamente!!!"); out.close(); } });

E está dando este errinho fera pra caramba ao compilar:

[code]Exception in thread “AWT-EventQueue-0” java.lang.Error: Unresolved compilation problems:
Unhandled exception type IOException
Unhandled exception type IOException
Unhandled exception type IOException

at gui.Tela1.getJButton(Tela1.java:338)
at gui.Tela1.getJContentPane(Tela1.java:145)
at gui.Tela1.getJFrame(Tela1.java:71)
at gui.Tela1.access$0(Tela1.java:66)
at gui.Tela1$4.run(Tela1.java:427)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)[/code]

Alguém pode me ajudar?
Obrigado! 8)

Me parece que esse erro é no ambiente grafico…

coloca as linhas 3, 4 e 5 dentro de um bloco try com IOException e poe um System.out.println (JOptionPane se vc preferir) no catch pra confirma…

editando… troca essas linhas tb por um system.out…

confirme se vc tem acesso a isso nessa maquina… (por mais q provavelmente não seja né…nunca se sabe)

Humm…

Eu acho que você tem que tratar erro, pois o FileWriter gera uma Exception!

Como é o escopo do try com o tratamento de IOException?

try{ FileWriter out = new FileWriter("arquivo.txt"); out.write("Paulinho relembrando Java fodasticamente!!!"); out.close(); }catch (IOException e) { // t.printStackTrace(); }

É mais ou menos isso? Por que ainda tá errado rs…
Valeu! 8)

Consegui, era só colocar ex na variável IOException ao invés de só a e.
Obrigado a todos!
8)

pode testar assim:

FileWriter wr = new FileWriter("arquivo.txt"); new PrintWriter(wr).println("Paulinho relembrando Java fodasticamente!!!");

[]´s

*Postamos ao mesmo tempo.

olha…o que eu costumo usar é bufferedreader e bufferedwriter pra esse tipo de coisa… e basicamente sempre fico no readLine…

try{
            java.io.BufferedWriter escreve = new BufferedWriter(new java.io.FileWriter("c:\arquivo.txt"));
            escreve.write("String");
            
            escreve.flush();
            escreve.close();
        }catch (java.io.IOException e){
            System.out.println("Erro de IO");
        }

[quote=maior_abandonado]olha…o que eu costumo usar é bufferedreader e bufferedwriter pra esse tipo de coisa… e basicamente sempre fico no readLine…
[/quote]

Qual a diferença? Para o FileWriter?

pra mim ser bem honesto…SEI LA…rsrsrs

imagino que o processamento dele seja bufferizado, lembro de ler certa vez q ele ao escrever manda acho que de 8 em 8 bytes…algo assim…

e lembro de ter lido tb aconselhando usar essa classe… bom… sei la … eu ainda so meio novato com programação… to aprendendo a minha primeira linguagem…

antes eu usava FileInputStream e FileOutputStream, mais o readLine do inputstream lia uns null entre as linhas direto…era um saco de trata isso, tava deprecated… ai eu intendio pq e resolvi usar alguma outra coisa e que seja mais recomendada pelos veteranos…kkk

edit…

FileReader não tem readLine… daria pra mim ir lendo os char e o for iria até um .available de um java.io.File apontando para o mesmo arquivo… mais acho mais facil usa o bufferedReader… e ir dando readLine até a resposta disso ser null

mais o real motivo de eu estar usando isso volto a fala q é por recoemndação mesmo… passo a palavra pros mais veteranos…rs

edit denvoo…rs

o que falei do buffer dele foi ensse tópico:

http://www.guj.com.br/posts/list/29682.java#160058

olhando o construtor dele, vi que vc pode enviar alem do reader, um int contendo o tamanho do buffer…

Vou dar o conselho correto, já que o pessoal nunca aprende isso direito:

As classes que terminam em Reader e Writer servem para lidar com arquivos-texto (que são compostos de caracteres).
As classes que terminam com InputStream e OutputStream servem para lidar com arquivos seqüenciais (que são compostos de bytes).
Como você sabe que um caracter é composto de bytes, existem duas classes (InputStreamReader e OutputStreamWriter) que servem, respectivamente, para transformar um InputStream em um Reader, e um OutputStream em um Writer.
Se você precisa de usar um arquivo de acesso aleatório, use RandomAccessFile.
As classes que começam por File (exceto a própria classe File) servem para uso com arquivos em disco.
A classe File tem um nome muito ingrato; ela deveria se chamar FileInfo (como no .NET), porque ela não serve para criar arquivos, mas sim para obter informações sobre eles. Por exemplo, para criar um diretório ou listar arquivos você usa a classe File.
As classes que começam por Buffered servem para encapsular outras classes (Reader, Writer, InputStream, OutputStream) e adicionar um buffer, para tornar o processamento mais rápido. Adicionalmente, no caso de BufferedReader, você pode usar o método readLine para ler linhas de um arquivo-texto.
As classes que começam por Print servem para você poder usar os métodos print e println, que permitem escrita de vários tipos de dados. Por exemplo, System.out é um PrintWriter.
Para você ler dados de um arquivo-texto, use a classe Scanner.

Entendi thingol muito obrigado!
Agora me surgiu outra dúvida: Estou em uma tela de cadastro onde jogo as informações em um arquivo texto separados por ‘;’ mas o porblema é que eu queria que ao usuário clicar pra gravar, ele grave no arquivo texto (o que já está fazendo) mas logo em seguida eu limpo a tela para ele já efetuar um novo cadastro, porém, logicamente ele está sobrepondo no arquivo. Como proceder para a gravação dos próximos cadastros se iniciem da posição correta do arquivo?
O trecho do código onde estou gravando no arquivo é o seguinte:

[code]public void actionPerformed(java.awt.event.ActionEvent e) {
// Grava em arquivo texto as informações
try{
FileWriter out = new FileWriter(“C://arquivo.txt”);
String sFilial = tFilial.getText();
String sAtendente = tAtendente.getText();
String sCliente = tCliente.getText();
String sCidade = tCidade.getText();
String sEstado = tEstado.getText();
String sNome = tNome.getText();
String sCargo = tCargo.getText();
String sEmail = tEmail.getText();
String sTelefone = tTelefone.getText();
String sObservacao = jTextPane.getText();

					out.write(sFilial+";"+sAtendente+";"+sCliente+";"+sCidade+";"+sEstado+";"+sNome+";"+sCargo+";"+sEmail+";"+sTelefone+";"+sObservacao);					
					out.close();
				}catch (IOException ex) {   
					System.out.println("Erro ao gerar o Arquivo, contate o Administrador do sistema!");				           
			    }[/code]

Obrigado! 8)

Tenta assim:

FileWriter out = new FileWriter("C://arquivo.txt", true);

[quote=ivo costa]Tenta assim:

FileWriter out = new FileWriter("C://arquivo.txt", true); [/quote]

Deu certo, mas como faço para ficar um cadastro embaixo do outro?
Como true ele não sobreescreve mais vai criando aquela linha gigante no arquivo.

Obrigado! 8)

Documentação nunca é demais. Use um PrintWriter, que já quebra as coisas em linhas usando println (é exatamente o mesmo do System.out.println).

Por exemplo:

[code]
public void actionPerformed(java.awt.event.ActionEvent e) {
// Grava em arquivo texto as informações
PrintWriter pw = null;
try{
pw = new PrintWriter (new FileWriter (“c:/arquivo.txt”));
String sFilial = tFilial.getText();
String sAtendente = tAtendente.getText();
String sCliente = tCliente.getText();
String sCidade = tCidade.getText();
String sEstado = tEstado.getText();
String sNome = tNome.getText();
String sCargo = tCargo.getText();
String sEmail = tEmail.getText();
String sTelefone = tTelefone.getText();
String sObservacao = jTextPane.getText();

    pw.println (sFilial+";"+sAtendente+";"+sCliente+";"+sCidade+";"+sEstado+";"+sNome+";"+sCargo+";"+sEmail+";"+sTelefone+";"+sObservacao);    
    
} catch (IOException ex) {   
    System.out.println("Erro ao gerar o Arquivo, contate o Administrador do sistema!");           
} finally {
    pw.close(); // se não me engano, pw.close não lança exception
}

}[/code]

Thingol deu certo o Printwriter valeu!

Mas uma pergunta neste mesmo fonte, como pode ver eu estou usando o getText() para pegar o conteúdo do JText e gravar no arquivo.

Porém já tenho esta classe para limitar o tamanho de meus JTexts:

[code]public class FixedLengthDocument extends PlainDocument
{
private int iMaxLength;

     public FixedLengthDocument(int maxlen) {
         super();
         iMaxLength = maxlen;
     }
 
     public void insertString(int offset, String str, AttributeSet attr)
                     throws BadLocationException    {
         if (str == null) return;
 
         if (iMaxLength <= 0)        // aceitara qualquer no. de caracteres
         {
             super.insertString(offset, str, attr);
             return;
         }
 
         int ilen = (getLength() + str.length());
         if (ilen <= iMaxLength)    // se o comprimento final for menor...
             super.insertString(offset, str, attr);   // ...aceita str
         }
 }[/code]

Mas minha dúvida é a seguinte, como estou gravando em meu arquivo separando por ‘;’ os campos.
Tem como no arquivo eu gravar o conteúdo que os usuários digitaram?

Está gravando assim:

01;Joaquim;Outrocampo;…
01;Zé;Outrocampo;…

Gostaria de saber se tem como eu gravar com espaços em branco para completar o tamanho do campo:

01;Joaquim ;Outrocampo;…
01;Zé ;Outrocampo;…

Valeu 8)

Bom, você pode usar um truquezinho do Java, que é o método String.format().

Se não me engano, se você quiser que uma string de 10 caracteres seja posta dentro de 20 posições (com espaços à direita), você pode usar:

String s = "1234567890";
String t = String.format ("%-20.20s", s); // deve dar "1234567890          "

Só para entender o que é o “%20.20s”,s?
Se eu quiser um de 40 caracteres fica “%80.80s,s” ?
Obrigado! 8)

Coloquei como falei:

String sAtendente = tAtendente.getText(); String sfAtendente = String.format("%-80.80tAtendente", tAtendente);

E deu o seguinte erro:

Exception in thread “AWT-EventQueue-0” java.util.IllegalFormatPrecisionException: 80
at java.util.Formatter$FormatSpecifier.checkDateTime(Unknown Source)
at java.util.Formatter$FormatSpecifier.(Unknown Source)
at java.util.Formatter.parse(Unknown Source)
at java.util.Formatter.format(Unknown Source)
at java.util.Formatter.format(Unknown Source)
at java.lang.String.format(Unknown Source)
at gui.Tela_Cad$1.actionPerformed(Tela_Cad.java:348)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Disfarça errei o s nos parametros, mas vejam com o código agora corrigido o que ele gravou em meu arquivo:

String sAtendente = tAtendente.getText(); String sfAtendente = String.format("%-80.80s", tAtendente);

Arquivo:

javax.swing.JTextField[,215,5,350x20,layout=javax.swing.plaf.basic.BasicTextUI$U

Tá bom, vamos lá. Eu iria pedir para você ler a documentação de java.util.Formatter, mas vou dizer mais ou menos o que tem de ser feito.

"%-20.20s" é:

"%s" -> formatação de strings.
"-" -> alinhado à esquerda.
"20" -> tamanho mínimo do campo.
".20" -> tamanho máximo do campo. (Ou seja, se a string tiver + de 20 caracteres, será truncada.)

Você usou "t" em vez de "s", e isso lhe provocou essa exception gigante.