FileOutputStream不会创建文件

时间:2013-01-17 12:15:50

标签: java file fileoutputstream

我实际上检查过可能与此相关的其他帖子,我找不到任何问题的答案。所以,不得不重新创建:

使用以下代码在给定位置不会创建文件:

    File as = new File ("C:\\Documents and Settings\\<user>\\Desktop\\demo1\\One.xls");
    if (!as.exists()) {
        as.createNewFile();
    }
    FileOutputStream fod = new FileOutputStream(as);
    BufferedOutputStream dob = new BufferedOutputStream(fod);
    byte[] asd  = {65, 22, 123};
    byte a1 = 87;
    dob.write(asd);
    dob.write(a1);
    dob.flush();

    if (dob!=null){
        dob.close();
    }
    if(fod!=null){
        fod.close();

代码运行正常,我没有得到任何FileNotFoundException !! 我有什么想念的吗?

2 个答案:

答案 0 :(得分:1)

您可以像这样重写代码:

BufferedOutputStream dob = null;
try {
    File file = new File("C:\\Documents and Settings\\<user>\\Desktop\\demo1\\One.xls");
    System.out.println("file created:" + file.exists());
    FileOutputStream fod = new FileOutputStream(file);
    System.out.println("file created:" + file.exists());
    BufferedOutputStream dob = new BufferedOutputStream(fod);
    byte[] asd = {65, 22, 123};
    byte a1 = 87;
    dob.write(asd);
    dob.write(a1);
    //dob.flush();
} 
catch (Exception ex) {
    ex.printStackTrace();
}
finally {
    if (dob != null) {
        dob.close();
    }
}
  

关闭此输出流并释放与该流关联的所有系统资源。    FilterOutputStream的close方法调用其flush方法,然后调用其基础输出流的close方法。

  • 因此,dob.flush()块中的try已被注释掉,因为dob.close()块中的finally行会刷新流。此外,它释放系统资源(例如“关闭文件”),如上面的apidoc引用中所述。使用finally block是一种很好的做法:
  

尝试阻止退出时, finally块始终执行。这确保即使发生意外异常也会执行finally块。但最终不仅仅是异常处理有用 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码。将清理代码放在finally块中总是一种很好的做法,即使没有预期的例外情况也是如此。

  • FileOutputStream constructor在磁盘上创建一个空文件:
  

创建文件输出流以写入由指定的File对象表示的文件。 创建一个新的FileDescriptor对象来表示此文件连接。   首先,如果有安全管理器,则调用其checkWrite方法,并将file参数表示的路径作为其参数。

     

如果文件存在但是是目录而不是常规文件,则不存在但无法创建,或者由于任何其他原因而无法打开,则会抛出FileNotFoundException

FileDescriptor的位置:

  

文件描述符类的实例充当底层机器特定结构的不透明句柄,表示打开文件,打开套接字或其他字节源或接收器。文件描述符的主要实际用途是创建一个FileInputStream或FileOutputStream来包含它。

     

应用程序不应创建自己的文件描述符。

此代码应生成文件或抛出异常。您甚至确认没有满足抛出异常的条件,例如:您正在替换字符串并且demo1目录存在。请将此内容重写为新的空文件并运行。

如果它仍然表现相同,除非我遗漏了某些东西,否则这可能是一个错误。在这种情况下,将此行添加到代码并发布输出:

 System.out.println(System.getProperty("java.vendor")+" "+System.getProperty("java.version"));

从路径上看,我会说你使用的是Win 7,对吗?什么版本?

答案 1 :(得分:-2)

然后这意味着您的目录中已有一个文件