Fechar arquivo ( classe File() )

Estou desenvolvendo uma aplicação para fazer upload de arquivo em um site FTP. A aplicação está funcionando perfeitamente. Porém eu só consigo manipular os arquivos que foram enviados depois que a aplicação é fechada. Por exemplo, tenho um diretório chamado “teste”, nesse diretório tem dois arquivos. Rodo minha aplicação e tento alterar o arquivo manualmente, ai diz que o arquivo está sendo usado. Quando fecho a aplicação eu consigo alterar, apagar, mover, … o arquivo. Na minha aplicação estou utilizando a classe File(). O envio do arquivo acontece no método sincronizar.

Classe de Envio

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.jdsistemas.ftp;

import br.com.jdsistemas.utilitarios.GerenciaMensagens;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.SocketException;
import java.text.ParseException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author JDassa
 */
public class FTP {

    private static FrmPrincipal principal;
    private static String path = new File("").getAbsolutePath();
    private static ClientFtp clientFtp = new ClientFtp();
    private static String linha = "", endFtp = "", usuario = "", senha = "", dirVirtual = "",
            dirLocal = "", horaSinc = "", porta = "";

    public static void main(String[] args) {
        try {
            IconeTray iconeTray = new IconeTray();
            iconeTray.exibir();

            carregarConfig();

            principal = FrmPrincipal.getInstance();
            principal.setVisible(true);
//            principal.sincronizar();

            SincronizarThread sincronizarThread = new SincronizarThread();
            sincronizarThread.start();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(FTP.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(FTP.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParseException ex) {
            principal.setLog(ex.getMessage());
            GerenciaMensagens.erroInicializarJanela(ex);
        }//fim do try/catch
    }//fim do método main

    /**
     * @return the path
     */
    public static String getPath() {
        return path;
    }

    public static void carregarConfig() throws FileNotFoundException, IOException {
        //Carregando configurações
        FileReader file = new FileReader(FTP.getPath() + "/config.jds");
        BufferedReader leitura = new BufferedReader(file);
        while ((linha = leitura.readLine()) != null) {
            try {
                if (linha.substring(0, 9).equals("endereco=")) {
                    endFtp = linha.substring(9);
                }
                if (linha.substring(0, 6).equals("porta=")) {
                    porta = linha.substring(6);
                }
                if (linha.substring(0, 8).equals("usuario=")) {
                    usuario = linha.substring(8);
                }
                if (linha.substring(0, 6).equals("senha=")) {
                    senha = linha.substring(6);
                }
                if (linha.substring(0, 11).equals("dirVirtual=")) {
                    dirVirtual = linha.substring(11);
                }
                if (linha.substring(0, 9).equals("dirLocal=")) {
                    dirLocal = linha.substring(9);
                }
                if (linha.substring(0, 9).equals("horaSinc=")) {
                    horaSinc = linha.substring(9);
                }
            } catch (IndexOutOfBoundsException erro) {
            }
        }
        file.close();
    }

    public static void sincronizar() {
        try {
            //Conectando
            principal.setLog("Conectando...");
            if (clientFtp.conectar(endFtp, porta, usuario, senha, dirVirtual)) {
                principal.setLog("Conectado!");
            } else {
                principal.setLog("Um erro aconteceu ao conectar com o servidor!");
            }//fim do if else


            //Enviando arquivos
            File diretorio = new File(dirLocal);
            File[] arquivos = diretorio.listFiles();

            if (arquivos != null) {
                for (int i = 0; i < arquivos.length; i++) {
                    File f = arquivos[i];

                    String nomeArq = f.getName();
                    double tamArq = f.length() / 1024;

                    if (f.isFile()) {
                        principal.setLog((i + 1) + " / " + arquivos.length + " -> Enviando arquivo '" + nomeArq + "' (" + tamArq + " Kb)...");

                        if (clientFtp.enviar(f.getAbsolutePath(), nomeArq)) {
                            principal.setLog("Arquivo '" + nomeArq + "' enviado!");
                        } else {
                            principal.setLog("Um erro aconteceu ao enviar o arquivo '" + nomeArq + "'!");
                        }//fim do if/else
                    }//fim do if

                }//fim do for
            }//fim do while

            //Desconectando
            principal.setLog("Desconectando...");
            if (clientFtp.desconectar()) {
                principal.setLog("Desconectado!");
            } else {
                principal.setLog("Um erro aconteceu ao desconectar com o servidor!");
            }//fim do if/else

        } catch (SocketException ex) {
            principal.setLog(ex.getMessage());
        } catch (IOException ex) {
            principal.setLog(ex.getMessage());
        } catch (Exception ex) {
            principal.setLog(ex.getMessage());
        }//fim do try/catch
    }//fim do método sincronizar

    /**
     * @return the horaSinc
     */
    public static String getHoraSinc() {
        return horaSinc;
    }

    public static void setHoraSinc(String hora) {
        horaSinc = hora;
    }

    public static void iniciarSincronia() {
        principal.sincronizar();
    }
}

Desde já agradeço!

troque file.close() por leitura.close()

eh leitura que está lendo o arquivo (leitura.readLine()), esse é o objeto que deve ser fechado, quando vc fechar o BufferedReader ele vai fechar automaticamenteo o FileReader que está sendo usado.

1 curtida

Ok. Obrigado. Era isso mesmo. Funcionou belezinha aqui.
Um abraço!