Fechar um objeto instanciado

3 respostas
H

bom dia a todos!!!
pessoal, seguinte...eu abro um jframe que me gera um txt . após isso, quando clico num botão, ele executa uma leitura num txt...beleza...aí, tenho um outro botão que apaga esse txt, que tbm tá funcionando certo...só que ele só funciona enquanto o método de leitura não for executado...se for executado, ele não faz nada...esse método fica aberto, impedindo o segundo, ou algo do genero???
bom, vamos lá... o conteudo do txt é "87", quando executo o metodo de leitura a ação é a seguinte

String teste = null;
        try{
                      File file = new File("sistema/info.txt");
                      FileInputStream f = new FileInputStream(file);
                      Scanner Scan = new Scanner(f);

                                  while(Scan.hasNext())
                                      {
                                      teste = Scan.next();
                                      info.setText(""+teste);
                                      }
                                
           }
          catch(Exception e){
              JOptionPane.showMessageDialog(rootPane, "erro!!não existe o tal arquivo!");
              dispose();
          }
já o segundo método, que só funciona se o primeiro não executar é o seguinte
Txt T = new Txt(); 
           if(T.DeletaArquivoTxt())
           {
            info.setText("");
            JOptionPane.showMessageDialog(rootPane, "arquivo deletado");
            dispose();
           }

enfim, tem algo a ver isso do metodo que le o txt ficar pendurado????
como resolvo isso???
Obrigado a todos!!!
Horácio

3 Respostas

nel

Como o arquivo está em uso, ele não permite que você faça alterações, é como se estivesse protegido.
Uma outra coisa, cadê o bloco finally com os closed ? Você instanciou um FileInputStream mas não fechou ele após o uso, ele vai permanecer em memória até a JVM decidir que o mesmo deve ser removido.

H
eu fiz assim, aparentemente funcionou, fechei o scan, que era a parte que lia o texto, tá correto pensar que o scan é a ponta do processo de leitura, aí, fechando ela, também fecho as demais???? digo isso, porque parece que deu certo, ou é pelo fato do Scan segurar o arquivo impedindo que eu o deletasse???? o que é mais correto pensar nesse caso??? olha só como eu fiz:
File file = new File("sistema/info.txt");
        String teste = null;
        try{
                      
                      FileInputStream f = new FileInputStream(file);
                      Scanner Scan = new Scanner(f);

                                  while(Scan.hasNext())
                                      {
                                      teste = Scan.next();
                                      info.setText(""+teste);
                                      }
                        Scan.close();   
           }
          catch(Exception e){
              JOptionPane.showMessageDialog(rootPane, "erro!!não existe o tal arquivo!");
              dispose();
          }

de resto, muito obrigado pela atenção, Nel!!!! grande abraço!!!
ah, galera do forum...agradeço a vocês tbm pela constante ajuda sempre que posto alguma dúvida!! muito obrigado mesmo, pessoal!!!
Horácio

nel

Evite dar nomes de variáveis que iniciem com letra maiúscula. Sobre o seu código, você deixou em aberto o FileInputStream. Funcionou, mas pode em algum momento não funcionar, pois o FileInputStream mantém o arquivo em aberto, sem a garantia de que o mesmo será fechado antes de você executar alguma ação, então, faça as seguintes modificações:

File file = new File("sistema/info.txt");  
  String teste = null;  
  FileInputStream fis = null;
  Scanner scan = null;
  try{  
                  
                fis = new FileInputStream(file);  
                scan = new Scanner(fis);  
  
                            while(scan.hasNext())  { 
                                teste = Scan.next();  
                                info.setText(""+teste);  
                            }  
     } catch(Exception e){  
        JOptionPane.showMessageDialog(rootPane, "erro!!não existe o tal arquivo!");  
        dispose();  
    } finally {
        if (null != fis)
            fis.close();
        if (null != scan)
            fis.close();
    }

Assim, garante que depois de toda a execução do seu método, serão fechados e evitando possíveis erros.

Criado 27 de março de 2012
Ultima resposta 29 de mar. de 2012
Respostas 3
Participantes 2