IOException - Access Denied Using FileOutputStream

26,151

Solution 1

The issue is that these calls step on each other:

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

The create operation fails because you just created a directory with the same name than the file you want to create.

What you want to do instead is:

fileToWrite.getParentFile().mkdirs()

And also, the call to createNewFile() is unnecessary.

Based on your code. The following "unzips" a zip file:

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();
    }
}

Disclaimer: I haven't tested it beyond the very basics.

Solution 2

Why are you calling createNewFile()? Just create the FileOutputStream.

Share:
26,151
David Castle
Author by

David Castle

Updated on July 15, 2022

Comments

  • David Castle
    David Castle almost 2 years

    I get the following 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)
    

    When trying to run the following piece of code :

    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();
            }
    
        }
    }
    

    It seems to me that for some reason the JVM can't create a new file. The code runs perfectly well if the files already exist. Is there some kind of access file which dictates whether the JVM can create a new file or am I simply doing something wrong?

    Any help is much appreciated :-)

    I'm running Java 1.4 and have been testing in JDeveloper in Windows XP.