IOException – 使用FileOutputStream拒绝访问

我得到以下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并且已经在Windows XP中的JDeveloper中进行了测试。

问题是这些调用相互衔接:

  fileToWrite.mkdirs(); //creates a directory eg 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(); } } 

免责声明:我没有测试它超出基本要求。

你为什么要调用createNewFile() ? 只需创建FileOutputStream即可。

也可能是在启动应用程序的上下文中,您没有访问尝试创建文件的位置的权限。 以管理员身份启动应用程序或在项目文件夹中创建文件。