java-AutoCloseable合同:写入close()中允许的资源?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-AutoCloseable合同:写入close()中允许的资源?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1643字,纯文字阅读大概需要3分钟。
内容图文
![java-AutoCloseable合同:写入close()中允许的资源?](/upload/InfoBanner/zyjiaocheng/668/5b24a6f382874157b3271d79db37ceb0.jpg)
我偶然发现了以下内部构造:
class OurXmlWriter implements AutoCloseable {
private XMLStreamWriter streamWriter;
public OurXmlWriter(OutputStream stream) {
streamWriter = XMLOutputFactory.newInstance()
.createXMLStreamWriter(outputStream, "UTF-8");
}
@Override
public void close() {
try {
// is this allowed?
streamWriter.writeEndDocument();
} catch (XMLStreamException e) {
throw new RuntimeException();
} finally {
try {
streamWriter.close();
} catch (XMLStreamException e) {
throw new RuntimeException();
}
streamWriter = null;
}
}
}
我们遇到的问题是:
try (OurXmlWriter writer = new OurXmlWriter(new FileOutputStream("output.xml"))) {
writer.writeStartTag();
// write some data elements correctly
throw new OutOfMemoryError(); // that's not done explicitly but happens
}
这仍然调用close()-这样很好,但是会导致xml被正确关闭(尽管这是不可靠的,因为我确定它不能保证在发生错误后会成功).
因此,问题基本上是XML是有效的,尽管我们不希望XML无效(因此,不会遗漏错误,因此不会意外处理输出).我正在考虑如何最好地解决这种情况-从close()中删除结束标签写入-这将需要大量的分析重新测试-或只是不使用try-with-resource来控制是否调用它.
但是我有一个普遍的问题是:
当系统提示您close()时,AutoCloseable合同是否仍允许写入您的资源中?我一直在阅读javadoc,但实际上并没有明确禁止它.我想念什么吗?
解决方法:
Java Standard类库中有一些示例,其中close()方法必须执行写操作.这样的示例是DeflaterOutputStream,其javadoc声明:
Writes remaining compressed data to the output stream and closes the underlying stream.
关键是压缩流的最后一位只有在您知道流已关闭时才可以.冲洗不足.
因此,将其与@Kayaman结合使用,有明确的证据表明在close()期间允许流执行写操作.
(另一个示例是BufferedOutputStream,如果需要的话,close()等效于flush()调用.)
内容总结
以上是互联网集市为您收集整理的java-AutoCloseable合同:写入close()中允许的资源?全部内容,希望文章能够帮你解决java-AutoCloseable合同:写入close()中允许的资源?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。