0

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

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

    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!我在这里有什么遗漏吗?

4

2 回答 2

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()intry块被注释掉,因为块中的dob.close()finally刷新了流。此外,它释放系统资源(例如“关闭文件”),如上面 apidoc 引用中所述。使用finally 块是一个很好的做法:

finally 块总是try 块退出时执行。这样可以确保即使发生意外异常也会执行 finally 块。但 finally 不仅仅对异常处理有用——它允许程序员避免清理代码意外地被 return、continue 或 break 绕过。将清理代码放在 finally 块中始终是一个好习惯,即使没有预料到异常也是如此。

  • FileOutputStream构造函数在磁盘上创建一个空文件:

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

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

FileDescriptor在哪里:

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

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

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

如果它仍然表现相同,除非我错过了什么,这可能是一个错误。在这种情况下,将此行添加到代码并发布输出:

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

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

于 2013-01-17T12:21:05.280 回答
-2

那么这意味着您的目录中已经有一个文件

于 2013-01-17T12:18:12.847 回答