IOException - Доступ запрещен, используя FileOutputStream - PullRequest
4 голосов
/ 21 октября 2009

Я получаю следующее IOException:

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.

Ответы [ 3 ]

11 голосов
/ 22 октября 2009

Проблема в том, что эти вызовы сталкиваются друг с другом:

  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() не нужен.

На основе вашего кода. Следующее «распакует» zip-файл:

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 голосов
/ 21 октября 2009

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

0 голосов
/ 16 мая 2014

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

...