IOException: acceso denegado utilizando FileOutputStream

Me sale la siguiente excepción 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) 

Al intentar ejecutar el siguiente fragmento de código:

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

Me parece que, por alguna razón, la JVM no puede crear un nuevo archivo. El código funciona perfectamente bien si los archivos ya existen. ¿Existe algún tipo de archivo de acceso que dicte si la JVM puede crear un nuevo archivo o simplemente estoy haciendo algo mal?

Cualquier ayuda es muy apreciada 🙂

Estoy ejecutando Java 1.4 y he estado probando en JDeveloper en Windows XP.

El problema es que estas llamadas se cruzan unas con otras:

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

La operación de creación falla porque acaba de crear un directorio con el mismo nombre que el archivo que desea crear.

Lo que quieres hacer en su lugar es:

fileToWrite.getParentFile().mkdirs()

Y también, la llamada a createNewFile() es innecesaria.

Basado en tu código El siguiente “descomprime” un archivo 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(); } } 

Descargo de responsabilidad: no lo he probado más allá de los conceptos básicos.

¿Por qué estás llamando a createNewFile() ? Solo crea el FileOutputStream.

También podría ser que, en el contexto en el que está lanzando la aplicación, no tenga derechos de acceso al lugar donde está intentando crear el archivo. Inicie la aplicación como administrador o cree el archivo en la carpeta del proyecto.

    Intereting Posts