2009-10-21 3 views
4

я получаю следующее IOException:IOException - Доступ запрещен Использование FileOutputStream

java.io.IOException: Access is denied 
at java.io.WinNTFileSystem.createFileExclusively(Native Method) 
at java.io.File.createNewFile(File.java:850) 
at zipUnzipper.main(zipUnzipper.java:41) 

При попытке выполнить следующий фрагмент кода:

public class zipUnzipper { 
    public zipUnzipper() { 
    } 

    public static void main(String[] args){ 

     //Unzip to temp folder. Add all files to mFiles. Print names of all files in mFfiles. 
     File file = new File("C:\\aZipFile.zip"); 
     String filename = file.getName(); 
     String filePathName = new String(); 

     int o = filename.lastIndexOf('.'); 
      filename = filename.substring(0,o); 

     try {  
       ZipFile zipFile = new ZipFile (file.getAbsoluteFile()); 
       Enumeration entries = zipFile.entries(); 
       while(entries.hasMoreElements()) { 
        ZipEntry zipEntry = (ZipEntry) entries.nextElement(); 
        System.out.println("Unzipping: " + zipEntry.getName()); 
        BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(zipEntry)); 
        byte[] buffer = new byte[2048]; 
        filePathName = "C:\\TEMP\\"+filename+"\\"; 
        File fileToWrite = new File(filePathName+ zipEntry.getName()); 
        fileToWrite.mkdirs(); 
        fileToWrite.createNewFile(); 
        FileOutputStream fos = new FileOutputStream(fileToWrite); 
        BufferedOutputStream bos = new BufferedOutputStream(fos , buffer.length); 
        int size; 
        while ((size = bis.read(buffer, 0, buffer.length)) != -1) { 
         bos.write(buffer, 0, size); 
        } 
        bos.flush(); 
        bos.close(); 
        bis.close(); 
       } 
       zipFile.close(); 
       File folder = new File (filePathName); 
       File [] mFiles = folder.listFiles(); 

       for (int x=0; x<mFiles.length; x++) { 
           System.out.println(mFiles[x].getAbsolutePath()); 
         } 
     } catch (ZipException ze) { 
      ze.printStackTrace(); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 

    } 
} 

Мне кажется, что по какой-то причине JVM может Не создавайте новый файл. Код работает отлично, если файлы уже существуют. Есть ли какой-то файл доступа, который определяет, может ли JVM создать новый файл, или я просто делаю что-то неправильно?

Любая помощь очень ценится :-)

Я бегу Java 1.4 и тестировали в JDeveloper в Windows XP.

+1

У вашей учетной записи Windows есть разрешения на создание файлов в этом каталоге? –

+0

http://stackoverflow.com/a/23697734/715269 – Gangnus

ответ

11

Вопрос заключается в том, что эти вызовы шаг друг на друга:

fileToWrite.mkdirs(); //creates a directory e.g. C:\temp\foo\x 
    fileToWrite.createNewFile(); //attempts to create a file C:\temp\foo\x 

создать сбой операции, потому что вы только что создали каталог с таким же именем, чем файл, который вы хотите создать.

Что вы хотите сделать вместо этого:

fileToWrite.getParentFile().mkdirs()

А также, вызов createNewFile() ненужно.

Основываясь на вашем коде. Далее «распаковывает» почтовый файл:

import java.io.*; 
import java.util.zip.ZipFile; 
import java.util.zip.ZipEntry; 
import java.util.Enumeration; 

public class Unzipper { 
    public static void main(String[] args) 
      throws IOException { 
     final File file = new File(args[0]); 
     final ZipFile zipFile = new ZipFile(file); 
     final byte[] buffer = new byte[2048]; 
     final File tmpDir = new File(System.getProperty("java.io.tmpdir"), zipFile.getName()); 

     if(!tmpDir.mkdir() && tmpDir.exists()) { 
      System.err.println("Cannot create: " + tmpDir); 
      System.exit(0); 
     } 

     for(final Enumeration entries = zipFile.entries(); entries.hasMoreElements();) { 
      final ZipEntry zipEntry = (ZipEntry) entries.nextElement(); 
      System.out.println("Unzipping: " + zipEntry.getName()); 

      final InputStream is = zipFile.getInputStream(zipEntry); 
      final File fileToWrite = new File(tmpDir, zipEntry.getName()); 
      final File folder = fileToWrite.getParentFile(); 
      if(!folder.mkdirs() && !folder.exists()) { 
       System.err.println("Cannot create: " + folder); 
       System.exit(0); 
      } 

      if(!zipEntry.isDirectory()) { 
       //No need to use buffered streams since we're doing our own buffering 
       final FileOutputStream fos = new FileOutputStream(fileToWrite); 
       int size; 
       while ((size = is.read(buffer)) != -1) { 
        fos.write(buffer, 0, size); 
       } 
       fos.close(); 
       is.close(); 
      } 
     } 
     zipFile.close(); 
    } 
} 

Отказ от ответственности: я не проверял за самые основы.

2

Почему вы звоните createNewFile()? Просто создайте FileOutputStream.

0

Также может случиться так, что в контексте запуска приложения у вас нет прав на место, где вы пытаетесь создать файл. Запустите приложение в качестве администратора или создайте файл в папке проекта.

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