Закройте файл, созданный с помощью FileOutputStream, для следующего удаления

В настоящее время у меня возникла проблема с FileOutputStream в моем Java-коде.

На самом деле я использую FileOutputStream для создания файла, но после создания файла нет возможности его удалить. Насколько я понял, это может быть связано с тем, что FileOutputstream не закрыт.

Ниже мой краткий код:

     outFile = new FileOutputStream(dir+"\\"+fileName);
     outFile.write("Test");
     outFile.flush();
     outFile.close();
     outFile = null;
     System.gc();

Тогда нет возможности удалить файл даже "вручную". Когда моя программа запущена, я не могу удалить ее в Windows с помощью простого del. Я также попытался удалить содержимое папки dir, и это тоже не сработало, используя этот код:

static public void delDir( String place )

{
    File path = new File( place );
    System.out.println(path.exists());//return true
    if( path.exists() )
        {
        File[] f = path.listFiles();
        for( int j = 0 ; j < f.length ; j++ )
            {
            if( f[ j ].isDirectory() )
                {
                deleteDirectory( path+"\\"+f[ j ] );
                }
            f[ j ].delete();
            }
        }
}

Итак, мой вопрос: как закрыть этот файл для следующего удаления (или как правильно удалить его, если мы не можем его закрыть)?


person user1619114    schedule 23.08.2012    source источник


Ответы (6)


Это ошибка Java. Да, это редко, но они есть;) Не могли бы вы добавить после outFile.close()

outFile = null;
System.gc();

А потом попробуйте его удалить. Есть больше возможностей, если это не работает. Дай мне знать.

ОБНОВЛЕНИЕ

У меня работает:

public class FileDeleteExample {
    public static void main(String[] args) throws Exception {
        File f = new File("test.txt");

        FileOutputStream outFile = null;

        try {
            outFile = new FileOutputStream(f);
            outFile.write("Test".getBytes());
        } finally {
            outFile.flush();
            outFile.close();
            outFile = null;
            System.gc();
        }

        f.delete();
    }
}

ОБНОВЛЕНИЕ

Я попробовал это с примером, упомянутым Сумитом Сингхом, удалив строки outFile=null; System.gc;, и это тоже работает для меня. Так что проблем с FileOutputStream быть не должно. Не могли бы вы попробовать приведенный выше небольшой пример и сказать, работает он или нет?

ОБНОВЛЕНИЕ

void closeQuietly(FileOutputStream out) {
    try { out.flush(); out.close(); } catch(Exception e) {} 
}

Теперь просто вызовите метод в блоке finally!

person christian.vogel    schedule 23.08.2012
comment
Я попробовал, но ничего не вышло. Я догадался, что это ошибка, да, именно об этом я читал на другом форуме. Любое другое решение, пожалуйста? Вы вроде в теме знаете =) - person user1619114; 23.08.2012
comment
(Да Постойте, я стараюсь. Спасибо за вашу помощь) - person user1619114; 23.08.2012
comment
в порядке. не забывайте, что test.txt должен существовать по пути вашего проекта :) - person christian.vogel; 23.08.2012
comment
Да, этот пример у меня работает. Я не знаю, что с моим, может быть, потому что я не смыл, не закрыл и т. Д. В конце концов? Когда я это делаю, мне нужно бросить или попытаться поймать в конце, это действительно странно. - person user1619114; 23.08.2012
comment
да, в конце концов, вы также должны ловить исключения. в моем примере я просто бросаю Exception, поэтому мне не нужно обрабатывать их ^^, но это только для примера. на мой взгляд, вы должны справиться с ними. Я добавил фрагмент кода, который вы можете использовать. - person christian.vogel; 23.08.2012
comment
YEEEEEEEES! Это работает, БОЛЬШОЕ СПАСИБО. Я всю ночь пытался решить эту проблему, и благодаря вам я наконец нашел решение !! Большое Вам спасибо !!!!! - person user1619114; 23.08.2012
comment
Я случайно проголосовал против, когда хотел проголосовать за ... пожалуйста, обновите свой ответ, чтобы я мог изменить свой голос (голос заблокирован). Спасибо! - person dberm22; 18.06.2013
comment
привет @ dberm22 извините, не видел ваш комментарий, я обновил свой ответ - person christian.vogel; 22.08.2013
comment
omG ты прав ... !!! это очень глупо, даже до JDK 8 ошибка все еще существует? .... в любом случае спасибо за это решение. - person gumuruh; 01.12.2020

Что ж, способ закрыть выходные и входные потоки файлов:

name.close()

и ваш код удаления выглядит нормально. Я бы рекомендовал использовать FileIO вместо FileOutputStream, если только вы не используете FileOutputStream по уважительной причине. Можно ли удалить файл после закрытия программы?

person sciguy1121    schedule 23.08.2012
comment
Да, я могу удалить их, как только они будут закрыты, пожалуйста, прочтите мой собственный код, приведенный выше. - person user1619114; 23.08.2012

Вы можете попробовать этот код ..

    File file = new File(dir+"\\"+fileName);
    FileOutputStream outFile;
    try {
        outFile = new FileOutputStream(file);
        outFile.write("Test".getBytes());
        outFile.flush();
        outFile.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
   file.delete();

Вы можете проверить эти ссылки ниже ..

  1. Я не могу удалить файл в java
  2. Java 'file.delete ()' не удаляет указанный файл!
  3. Удаление файла Java 6
person Sumit Singh    schedule 23.08.2012
comment
Нет, я тоже использовал флеш, я забыл добавить его, но он не работает ... Насколько я мог прочитать, это ошибка, поэтому я ищу решение. - person user1619114; 23.08.2012
comment
@ user1619114 прав. промывка не поможет, так как это ошибка - person christian.vogel; 23.08.2012
comment
@ user1619114 Я не знаю, почему он не работает для вас, потому что он работает для меня. Возможно, ваш файл открыт в другом приложении. вы открывали его с помощью какого-то редактора ...? Если да, то проверьте это на своем системном мониторе. Может быть, это приложение все еще работает. - person Sumit Singh; 23.08.2012
comment
Нет, больше нигде не открывается: / ... Взгляните на ответ christian.vogel, вроде бы это известная ошибка, но я не знаю, что делать! - person user1619114; 23.08.2012
comment
ваш пример тоже работал у меня (см. мой ответ). Я думаю, что есть еще кое-что, почему у него это не работает. - person christian.vogel; 23.08.2012

Лучше использовать FileUtils.deleteDirectory из Apache Commons IO. Преодолевает ошибку удаления Java, уменьшает количество используемого кода и, самое главное, работает.

Вместо звонка

delDir(place);

просто позвони

FileUtils.deleteDirectory(new File(place));

Обновление: в своем delDir методе вы вызываете:

deleteDirectory(new File(path + "\\" + f[j]));

но результат

File[] f = path.listFiles();

будет уже включать путь в файл, поэтому вы можете просто использовать:

deleteDirectory( f[j].getPath() );
person Reimeus    schedule 23.08.2012
comment
Здравствуйте, как вы могли видеть, да, я использовал deleteDirectory (путь + \\ + f [j]); , а может я неправильно понял ваше предложение? - person user1619114; 23.08.2012
comment
Вам необходимо загрузить библиотеку commons.apache.org/io/download_io.cgi & добавьте JAR в свой путь к классам - person Reimeus; 23.08.2012
comment
Хорошо, я сделал это, но это та же проблема, у меня такое же исключение: java.io.IOException: невозможно удалить файл - person user1619114; 23.08.2012

На самом деле не связано, но:

Это решение закрытия файла помогло мне с другой проблемой. При запуске программы из java 6 новый процесс был приостановлен до тех пор, пока я не закрыл свое приложение (в java 7 это было нормально). Решение, основанное на этом ответе, помогло:

    String[] com = new String[]{javaRun, arg1, arg2, arg3, arg4};

    Process proc = Runtime.getRuntime().exec(com, null, dir);

    proc = null;
    System.gc();

Это работает с java 6. Спасибо за вдохновение.

person tremoor    schedule 30.07.2013

Проблема может быть в первой строке: outFile = new FileOutputStream (dir + "\" + fileName);

  1. Не уверен, что требуется новое.
  2. Не верьте, что каталог должен быть включен в путь. AFAIK каталог для FileOutputStream определяется как внутренний каталог приложения.

HTH

person John L    schedule 01.12.2017