IOException - 使用 FileOutputStream 拒绝访问

Posted

技术标签:

【中文标题】IOException - 使用 FileOutputStream 拒绝访问【英文标题】:IOException - Access Denied Using FileOutputStream 【发布时间】:2010-12-08 19:10:09 【问题描述】:

我得到以下 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 中进行测试。

【问题讨论】:

您的 Windows 帐户是否有权在该目录中创建文件? ***.com/a/23697734/715269 您是否尝试过关闭 fileToWrite 然后重新打开它? 【参考方案1】:

问题是这些调用相互影响:

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

免责声明:我没有在非常基础的基础上对其进行过测试。

【讨论】:

【参考方案2】:

你为什么打电话给createNewFile()?只需创建 FileOutputStream。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于IOException - 使用 FileOutputStream 拒绝访问的主要内容,如果未能解决你的问题,请参考以下文章

io流之转换流InputStreamReaderOutputStreamWriter

OutputStream-InputStream-FileOutputStream-FileInputStream-BufferedOutputStream-BufferedInputStream(示

OutputStream-InputStream-FileOutputStream-FileInputStream-BufferedOutputStream-BufferedInputStream-四

OutputStream-InputStream-FileOutputStream-FileInputStream-BufferedOutputStream-BufferedInputStream-四

编写一个文件分割工具,能把一个大文件分割成多个小的文件。并且能再次把它们合并起来得到完整的文件。

黑马基础阶段测试题:通过字符输入流读取info.txt中的所有内容,每次读取一行,将每一行的第一个文字截取出来并打印在控制台上。