FileNotFound (доступ запрещен) Исключение для java.io - PullRequest
8 голосов
/ 10 ноября 2011

Почему я получаю эту ошибку при запуске этой программы? Это происходит после случайных итераций. Обычно после 8000-й итерации.

public static void main(String[] args)
{
    FileWriter writer = null;
    try
    {
        for(int i = 0; i < 10000; i++)
        {
            File file = new File("C:\\Users\\varun.achar\\Desktop\\TODO.txt");

            if(file.exists())
            {
                System.out.println("File exists");
            }
            writer = new FileWriter(file, true);
            writer.write(i);
            System.out.println(i);
            writer.close();
            if(!file.delete())
            {
                System.out.println("unable to delete");
            }

            //Thread.sleep(10);
            //writer = null;
            //System.gc();
        }
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
    finally
    {
        if(writer != null)
        {
            try
            {
                writer.close();
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}

После возникновения исключения файл отсутствует. Это означает, что он удаляется, но FIleWriter пытается получить блокировку до этого, даже если это не многопоточная программа. Это потому, что Windows не удаляет файл достаточно быстро, и, следовательно, FileWriter не получает блокировку? Если так, то метод file.delete () возвращается до того, как Windows действительно удалит его?

Как мне решить эту проблему, поскольку во время нагрузочного тестирования моего приложения возникает похожая проблема.

РЕДАКТИРОВАТЬ 1: Stacktrace:

java.io.FileNotFoundException: C:\Users\varun.achar\Desktop\TODO.txt (Access is denied)     
at java.io.FileOutputStream.openAppend(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:192)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:116)
    at java.io.FileWriter.<init>(FileWriter.java:61)

РЕДАКТИРОВАТЬ 2 : Добавлены условия file.exists () и file.delete в программе. и новая трассировка стека:

7452
java.io.FileNotFoundException: C:\Users\varun.achar\Desktop\TODO.txt (Access is denied)
    at java.io.FileOutputStream.openAppend(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:192)
    at java.io.FileWriter.<init>(FileWriter.java:90)
    at com.TestClass.main(TestClass.java:25)

РЕДАКТИРОВАТЬ 3 Дамп потока

TestClass [Java Application]    
    com.TestClass at localhost:57843    
        Thread [main] (Suspended (exception FileNotFoundException)) 
            FileOutputStream.<init>(File, boolean) line: 192    
            FileWriter.<init>(File, boolean) line: 90   
            TestClass.main(String[]) line: 24   
    C:\Users\varun.achar\Documents\Softwares\Java JDK\JDK 6.26\jdk\jre\bin\javaw.exe (09-Nov-2011 11:57:34 PM)  

РЕДАКТИРОВАТЬ 4 : Программа успешно работает на другом компьютере с той же ОС. Теперь, как мне убедиться, что приложение успешно запущено на компьютере, на котором оно развернуто?

Ответы [ 9 ]

4 голосов
/ 11 ноября 2011

В любой операционной системе у вас может быть только определенное количество открытых файлов / потоков. Похоже, вы достигли предела своей ОС. Попробуйте установить файл равным нулю внутри цикла.

2 голосов
/ 11 августа 2012

У меня была та же проблема: Java-программа (однопотоковая), которая открывается, удаляется, а затем постоянно открывает один и тот же файл.

В некоторых системах Windows мы сталкиваемся с той же проблемой, о которой сообщалось здесь, в Linux, Solaris и других системах Windows она работает нормально.

Трассировка программы с помощью SysInternals Process Monitor (теперь MS) ее очистка сначала выполняется на уровне операционной системы, а очистка последующих неудачных открытий с состоянием PENDING DELETE.

Таким образом, кажется, что на уровне OS / NTFS / Disk есть некоторая небольшая задержка, прежде чем файл будет фактически удален, и это является причиной случайного сбоя в нашем случае.

В качестве обходного пути я изменил вызов .delete (), вместо этого просто записал поверх него новый FileWriter (файл), и это, похоже, работает.

Проблема возникла не во всех системах, одна конкретная модель, которая всегда будет выходить из строя, и все это, будь то после фиксированного числа циклов, была Windows 7 / Dell Latitude E6420 с WD Smartdrive, тогда как моя Windows 7 / Dell Precision M4600 (с твердотельным накопителем) или T3400 с Linux У меня никогда не было проблемы.

Приветствия - Марк

2 голосов
/ 10 ноября 2011

Если я правильно понимаю трассировку стека, исключение наступает при попытке создать новый FileWriter. Невозможно узнать причину, не исследуя немного дальше.

  • Возвращаемые значения могут что-то сказать. Особенно, проверьте, что File.delete() возвращает.
  • Прежде чем пытаться создать новый FileWriter, проверьте, что возвращает File.exists().

Если предыдущий delete() возвращает true, а exists() сразу после него также возвращает true в однопоточной программе, то это действительно что-то странное.

Редактировать: , поэтому кажется, что удаление прошло успешно, а файл не существовал после этого. Конечно, так оно и должно работать, поэтому странно, почему FileWriter выдает исключение. Еще одна мысль, попробуйте проверить File.getParentFile().canWrite(). То есть ваши разрешения на запись в каталог каким-то образом исчезают.

Редактировать 2:

Не получайте ошибку на другом компьютере с той же ОС. Теперь, как мне убедиться, что эта ошибка не появится в приложении, где она будет развернута?

Пока у вас есть одна машина, которая работает неправильно, и одна , которая работает правильно. Может быть, вы могли бы попробовать это на еще большем количестве машин. Вполне возможно, что первая машина как-то сломана, и это вызывает ошибки. Удивительно, как часто цифровые компьютеры и их программы (я имею в виду ОС и Java, а не обязательно вашу программу) могут быть просто «немного сломаны», так что они почти всегда работают почти идеально, но случайным образом выходят из строя с некоторым конкретным оборудованием & вариант использования - обычно под большой нагрузкой - аналогично тому, как могут вести себя некорректные многопоточные программы. Это не ваша вина, чтобы быть вашей проблемой: -)

Честно говоря, единственный способ сделать уверенным , что ошибки не появятся на компьютере X, - это запустить программу на компьютере X. Необычные вещи, такие как создание и удаление одного и того же файла 8000 раз в быстром режиме наследование подвержено ошибкам, даже если оно «должно» работать. Компьютеры, операционные системы и API-интерфейсы не идеальны. Чем более необычные вещи вы делаете, тем чаще недостатки проявляются, потому что необычное использование, как правило, менее тщательно проверяется, чем повседневные операции.

1 голос
/ 10 ноября 2011

Это может быть длинный выстрел, но вы можете попробовать работать с файлом, который НЕ находится непосредственно на рабочем столе.Вместо:

"C:\\Users\\varun.achar\\Desktop\\TODO.txt"

Попробуйте:

"C:\\Users\\varun.achar\\SomeOtherDirectory\\TODO.txt"

ОС может убить вас здесь всеми хуками рабочего стола ...

РЕДАКТИРОВАТЬосновываясь на комментариях:

  • Есть ли запланированные задания на «плохой» машине?
  • Вместо того, чтобы отлаживать среду, у вас есть системный администратор, чтобы сделать это?
  • Работает ли это при чистой установке Windows?[95% вероятности, что это произойдет]
  • Поскольку коренная причина, по-видимому, связана с окружающей средой, вместо решения проблемы конфигурации Windows вы сможете продолжить выполнение других задач и оставить это кому-то, кто ведет списокнесоответствий между системами?
1 голос
/ 10 ноября 2011

Можете ли вы условно попытаться записать в файл?

Используя file.exists, а затем записать в него, чтобы вы потенциально могли избежать любых других проблем.Трудно сказать из этого исключения.

http://download.oracle.com/javase/6/docs/api/java/io/File.html#exists()

Не могли бы вы также опубликовать дамп потока в этот момент, просто для дальнейшей отладки.

Пожалуйста, очистите писатель,прежде чем писать снова.

0 голосов
/ 16 августа 2013

У меня была такая же проблема (FileWriter & Access Denied).

Моя догадка по причине: Windows 7 установила блокировку файла, потому что в окне проводника был показан предварительный просмотр содержимого файла (файл был выбран в окне).

Решение: я отменил выбор файла в окне проводника.И исключение IOException пропало.

0 голосов
/ 11 ноября 2011

Спасибо, ребята, что выручили меня, но, наконец, это решено.

public static void main(String[] args)
    {
        FileWriter writer = null;
        try
        {
            for(int i = 0; i < 10000; i++)
            {
                File file = new File("C:\\tenant-system-data\\abc.txt");
                if(!file.getParentFile().canWrite())
                {
                    System.out.println("parent file error");
                }
                if(file.exists())
                {
                    System.out.println("File exists");
                }
                int count = 0;
                while(count++ < 5)
                {
                    try
                    {
                        file.createNewFile();
                        break;
                    }
                    catch(IOException e)
                    {
                        try
                        {
                            Thread.sleep(100);
                        }
                        catch(InterruptedException e1)
                        {
                            e1.printStackTrace();
                        }

                    }
                }
                writer = new FileWriter(file, true);
                writer.write(i);
                System.out.println(i);
                writer.close();
                if(!file.delete())
                {
                    System.out.println("unable to delete");
                }

                //Thread.sleep(10);
                //writer = null;
                //System.gc();
            }
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if(writer != null)
            {
                try
                {
                    writer.close();
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
0 голосов
/ 10 ноября 2011

Это сценарии, которые вы должны обработать перед удалением файла. http://www.java2s.com/Code/Java/File-Input-Output/DeletefileusingJavaIOAPI.htm

по крайней мере проверьте возвращаемое значение в вашей программе.

0 голосов
/ 10 ноября 2011

У вас есть разрешение на удаление в каталоге, но нет разрешения на создание.

...