IOException - Access Denied Using FileOutputStream
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.
![David Castle](https://i.stack.imgur.com/w8kwA.jpg?s=256&g=1)
David Castle
Updated on July 15, 2022Comments
-
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.