2016-05-02 4 views
0

Я написал программу для файлов копий. Для каждого файла есть поток, который передает процесс копирования. После копирования файла я хочу удалить файл, но файл заблокирован. После завершения процесса я закрыл входной поток и выходной поток файла. Любые идеи, почему я не могу удалить файлы, даже после того, как оба потока были закрыты? Проект довольно большой, поэтому я не могу опубликовать весь код здесь.Java: файл заблокирован?

Это та часть, где файл копируется:

OutputStream outputStream = null; 
try { 
    outputStream = new FileOutputStream(outputFile); 
    int read = 0; 
    byte[] bytes = new byte[1024]; 
    while ((read = inputStream.read(bytes)) != -1) { 
     outputStream.write(bytes, 0, read); 
    } 
    outputStream.flush(); 

} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    if(inputStream != null) { 
     try { 
      inputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    if(outputStream != null) { 
     try { 
      outputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Что вы подразумеваете под "копией"? В любом случае не изобретайте колесо повторно: http://stackoverflow.com/questions/927203/java-copy-file-to-either-new-file-or-existing-file – Ozgur

+0

Просто потому, что вы можете скопировать его с помощью java программа не означает, что программа java - это то, что блокирует файл. Может быть, что-то еще на вашем компьютере блокирует этот файл? –

+0

Какую ОС вы используете? –

ответ

0

Одной из возможных причин является то, что ваш входной поток не был открыт в try{}/finally{} блоке, в котором он закрыт. Из-за этого, если в вашем InputStream возникает ошибка, файл будет закрыт только в том случае, если эта ошибка произошла внутри блока, который вы показываете выше.

Вторая возможная причина заключается в том, что вы закрываете две вещи внутри одного и того же блока finally. Начиная с close() throws IOException, если произошло исключение, закрывающее первый файл, второй файл не будет закрыт. Возможно, вам стоит рассмотреть возможность выделения всех ваших закрываемых ресурсов с помощью синтаксиса try-with-resources, который позаботится о закрытии файлов для вас и исключит возможность исключения одного из них, если другой файл будет закрыт должным образом. Например,

try(InputStream = new FileInputStream(inputFile); OutputStream outputStream = new FileOutputStream(outputFile)) { 
    ... your logic goes here 
} 

Вы можете добавить catch, если вы хотите, но вам больше не нужно finally так как ваши файлы будут закрыты для вас, даже если исключения выбрасываются.

0

Похоже, что у вас недостаточно прав для создания файла через FileOutputStream.

Только что проверил ваш код на моей машине, и он работал с надлежащими разрешениями на запись.

 Смежные вопросы

  • Нет связанных вопросов^_^