[RESOLVIDO] Dúvida IO

    private void salvarNomes() {
        try {
            ObjectInputStream is = new ObjectInputStream(new FileInputStream("nomes.nomes"));
            ArrayList<ClsNomes> lista = (ArrayList<ClsNomes>) is.readObject();
            is.close();
            StringBuilder path = new StringBuilder(new File("").getAbsolutePath() + "\\");
            File file = new File(path.toString() + "nomes.txt");
            File rename = new File(path.toString() + "nomesB.txt");
            if (file.renameTo(rename)) {
                PrintWriter pw = new PrintWriter(file);
                if (file.isFile()) {
                    DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
                    for (ClsNomes c : lista) {
                        pw.println(c.getNome() + "," + c.getTelefone() + "," + df.format(c.getDtaNascimento()));
                    }
                    pw.flush();
                    pw.close();
                }
            }
        } catch (FileNotFoundException e) {
            Mensagens.erro("Arquivo não encontrado", "IO");
            Erros.registraErro(e.getMessage());
            System.exit(0);
        } catch (IOException ex) {
            Mensagens.erro("Arquivo ao salvar arquivo", "IO");
            Erros.registraErro(ex.getMessage());
            System.exit(0);
        } catch (ClassNotFoundException exa) {
            Mensagens.erro("A classe não pôde ser encontrada", "IO");
            Erros.registraErro(exa.getMessage());
            System.exit(0);
        }
    }

Fiz esse codigo so para entender melhor Serialization… Ai beleza! Deu certo! O objeto foi salvo em outro método… Ai eu recupero ele nesse e da tudo certo. Até chegar em if (file.renameTo(rename)). Nao ta proseguindo o programa! Essa expressão está resultando em “false”!
Alguém sabe por que?
Depois do rename eu nem me preocupei ainda porque o programa nunca passou dali mesmo… =P

Vlws!

edit: btw, so estou querendo renomear o arquivo “nomes.txt” que ja existe pra fazer um backup antes de fazer a operação de escrever!
edit: fazendo file.isFile() retorna true!

Primeira coisa - você pode trocar isto aqui, que deixa seu programa chumbado no Windows:

#         StringBuilder path = new StringBuilder(new File("").getAbsolutePath() + "\\");  
#         File file = new File(path.toString() + "nomes.txt");  
#         File rename = new File(path.toString() + "nomesB.txt");  

para:

File currentPath = new File (".");
File file = new File (currentPath, "nomes.txt");
File rename = new File (currentPath, "nomesB.txt");

Segunda coisa - renameTo não consegue renomear alguma coisa se o arquivo de destino já existir. Você precisa verificar se o destino (que no caso é nomesB.txt) já existe; se existir, remova-o.

Beleza! Valeu pela dica! Vou mudar usando o path como diretorio pro construtor do File né!

O arquivo nomesB.txt nao existe =.

So existe o arquivo nomes.txt!

public static void main(String[] args) {
        try {
            File currentPath = new File(".");
            File file = new File(currentPath, "teste.txt");
            file.createNewFile();
            File renamte = new File(currentPath, "teste2.txt");
            if (file.renameTo(renamte)) {
                System.out.println("tudo certo");
            }
        } catch (Exception e) {
        }
    }

Fiz esse programa pra testar… Se o arquivo nao existir ele cria e renomeia… Ok
Se o arquivo “teste2.txt” ja existe, ele cria o arquivo teste.txt, e como você disse nao consegue renomear para “teste2.txt” porque “teste2.txt” já existe.
Se o arquivo “teste.txt” já existe e o arquivo “teste2.txt” não existe… Ele renomeia normalmente o arquivo “teste.txt” para “teste2.txt”!
O meu programa é parecido com esse ultimo caso, ja existe o arquivo “nomes.txt” que eu quero renomear para “nomesB.txt” e não ta dando certo o_o

[quote=Murl]Beleza! Valeu pela dica! Vou mudar usando o path como diretorio pro construtor do File né!

O arquivo nomesB.txt nao existe =.

So existe o arquivo nomes.txt![/quote]

Essa história de “não existe” só acredito vendo :stuck_out_tongue:
De qualquer maneira, tome sempre um pouco de cuidado - o retorno de renameTo não é particularmente muito confiável no Windows, já que basicamente o Java deixa o abacaxi para a API do Windows “MoveFile” e essa API não é muito católica; eu normalmente faço o seguinte: crio um método que faz 3 coisas:

a) Remove o arquivo destino, caso existir
b) Executa renameTo
c) Checa se o arquivo original não existe mais e se o arquivo destino foi criado com esse nome. Se isso houver ocorrido, eu retorno true, senão retorno false.


mudei o nome do arquivo pra você acreditar que ele nao existe entao =P
Rodei 3 vezes e deu 3 numeros diferentes e nao deu certo renomear...

O problema é que nao quero deletar o arquivo pra ele servir como backup entendeu? Logo abaixo eu crio o "nomes.txt" de novo com os novos nomes. Mas ai eu pensei... Se eu somente deletar o arquivo "nomes.txt" e alguma catastrofe acontecer durante o processo de criação dele de novo, tudo será perdido!

edit: esquece... lá atras eu tinha esquecido de fechar um BufferedReader com esse arquivo =X

mudei o nome do arquivo pra você acreditar que ele nao existe entao =P
Rodei 3 vezes e deu 3 numeros diferentes e nao deu certo renomear…

O problema é que nao quero deletar o arquivo pra ele servir como backup entendeu? Logo abaixo eu crio o “nomes.txt” de novo com os novos nomes. Mas ai eu pensei… Se eu somente deletar o arquivo “nomes.txt” e alguma catastrofe acontecer durante o processo de criação dele de novo, tudo será perdido!

edit: esquece… lá atras eu tinha esquecido de fechar um BufferedReader com esse arquivo =X