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

}

}

免责声明:我还没有测试过最基本的内容。

以上是 IOException-使用FileOutputStream拒绝访问 的全部内容, 来源链接: utcz.com/qa/406457.html

回到顶部