关闭 FilterWriter 后为什么它可以工作?
After closing FilterWriter why it is working?
在下面的代码中,我在向 FilterWriter
写入任何内容之前使用 close()
方法关闭了 FilterWriter
并且在流关闭后,如果我们尝试调用这些方法FilterWriter
上的 write()
或 flush()
应该会导致抛出 IOException
。
但这里调用 write()
方法工作正常,没有抛出异常。为什么?
import java.io.FilterWriter;
import java.io.StringWriter;
import java.io.Writer;
public class MyClass {
public static void main(String[] args) {
try {
Writer writer = new StringWriter(10);
FilterWriter filterWriter = new FilterWriter(writer) {};
filterWriter.close();
filterWriter.write(65);
String str = writer.toString();
System.out.println(str);
} catch (Exception e) {
System.out.println("Exception: " + e.toString());
}
}
}
输出:
A
FilterWriter的close()函数调用底层writer的close()函数。
在您的情况下,底层编写器的类型为 StringWriter 并且根据 javadoc 的 Stringwriter here
的 close() 函数
Closing a StringWriter has no effect.
因此您不会遇到任何错误。
这是因为关闭 FilterWriter
会调用底层 Writer
的 close
方法,这是您在构造函数中传递的方法。
您的基础 Writer
是一个 StringWriter
,其 close
implementation does nothing at all. (which is also what the documentation for the close
method 表示)。
因此,当您在调用 close
后尝试写入它时,实际上不会抛出任何异常。
在下面的代码中,我在向 FilterWriter
写入任何内容之前使用 close()
方法关闭了 FilterWriter
并且在流关闭后,如果我们尝试调用这些方法FilterWriter
上的 write()
或 flush()
应该会导致抛出 IOException
。
但这里调用 write()
方法工作正常,没有抛出异常。为什么?
import java.io.FilterWriter;
import java.io.StringWriter;
import java.io.Writer;
public class MyClass {
public static void main(String[] args) {
try {
Writer writer = new StringWriter(10);
FilterWriter filterWriter = new FilterWriter(writer) {};
filterWriter.close();
filterWriter.write(65);
String str = writer.toString();
System.out.println(str);
} catch (Exception e) {
System.out.println("Exception: " + e.toString());
}
}
}
输出:
A
FilterWriter的close()函数调用底层writer的close()函数。 在您的情况下,底层编写器的类型为 StringWriter 并且根据 javadoc 的 Stringwriter here
的 close() 函数Closing a StringWriter has no effect.
因此您不会遇到任何错误。
这是因为关闭 FilterWriter
会调用底层 Writer
的 close
方法,这是您在构造函数中传递的方法。
您的基础 Writer
是一个 StringWriter
,其 close
implementation does nothing at all. (which is also what the documentation for the close
method 表示)。
因此,当您在调用 close
后尝试写入它时,实际上不会抛出任何异常。