我实际上检查了其他可能与此相关的帖子,我找不到任何回答我的问题。因此,必须创建这个new:
文件不会在给定的位置创建,代码如下:
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!!我是不是错过了什么?
你可以这样重写你的代码:
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();
}
}
- 在这种情况下,只需要调用最顶层的流处理程序close()方法- BufferedOutputStream的一个:
关闭该输出流,释放与该流关联的所有系统资源。 FilterOutputStream的close方法调用其flush方法,然后调用其底层输出流的close方法。
- 因此,
try
块中的dob.flush()
被注释掉,因为finally
块中的dob.close()
行刷新了流。此外,它还释放了系统资源(例如:"关闭文件"),如上面的apidoc引用中所述。使用finally块是一个很好的做法:
finally块总是在try块退出时执行。这确保即使发生意外异常,finally块也会被执行。但是finally不仅仅对异常处理有用——它允许程序员避免清理代码被return、continue或break意外绕过。将清理代码放在finally块中始终是一种好做法,即使没有预期的异常。
- FileOutputStream构造函数在磁盘上创建一个空文件:
创建一个文件输出流,写入指定file对象所表示的文件。创建一个新的FileDescriptor对象来表示这个文件连接。首先,如果存在安全管理器,则调用其checkWrite方法,并将file参数表示的路径作为参数。
如果文件存在,但是一个目录而不是一个常规文件,不存在但无法创建,或由于任何其他原因无法打开,则抛出FileNotFoundException
其中FileDescriptor是:
文件描述符类的实例作为表示打开的文件、打开的套接字或其他字节源或接收的底层机器特定结构的不透明句柄。文件描述符的主要实际用途是创建一个FileInputStream或FileOutputStream来包含它。
应用程序不应该创建自己的文件描述符。
这段代码要么生成文件,要么抛出异常。您甚至已经确认不满足引发异常的条件,例如,您正在替换字符串并且demo1目录存在。请将此文件重写为新的空文件并运行。
如果它仍然表现相同,除非我错过了什么,这可能是一个bug。在这种情况下,将这一行添加到代码中并发布输出:
System.out.println(System.getProperty("java.vendor")+" "+System.getProperty("java.version"));
从路径来看,我认为你使用的是Win 7,对吗?什么版本?
那么说明目录中已经存在一个文件