Originariamente inviato da citrus
devo scrivere un programma che verifica la presenza di un file e che, se non lo trova subito, continua a verificarne la presenza per un dato tempo (il timeout è definito dall'utente).
Ecco una possibile soluzione:
codice:
import java.io.File;

public class WaitForFile
{
    private File f;

    public WaitForFile (File f)
    {
        this.f = f;
    }

    public boolean waitUntilExists (long timeout)
        throws InterruptedException
    {
        final Object monitor = new Object ();

        synchronized (monitor)
        {
            Runnable r = new Runnable ()
            {
                public void run ()
                {
                    try
                    {
                        while (true)
                        {
                            if (f.exists ())
                                break;

                            Thread.sleep (50);
                        }
                    }
                    catch (InterruptedException e) { }

                    synchronized (monitor)
                    {
                        monitor.notify ();
                    }
                }
            };

            Thread t = new Thread (r);
            t.start ();

            try {
                monitor.wait (timeout);
            } finally {
                t.interrupt ();
            }
        }

        return f.exists ();
    }
}
Da usare così:
codice:
WaitForFile wff = new WaitForFile (new File ("nomefile"));

try
{
    boolean exists = wff.waitUntilExists (8000);  // 8 secondi di timeout

    System.out.println (exists ? "esiste" : "non esiste");
}
catch (Exception e)
{
    System.out.println (e);
}
Non ho certo la pretesa di dire che è perfetto ... anzi, io stesso non sono sicuro al 100% della correttezza di quello che ho scritto. Se qualcuno più esperto sa dirmi se è valido o meno, ringrazio.