java io/nio中“装饰器”模式应用,引发的流关闭问题(内存泄漏)

qulimin18 2010-04-21 10:35:10
1.在IO中采用“装饰器”模式来操纵流,到后面再关闭流/管道的时候,像这样:
FileChannel fc = new FileInputStream(filePath).getChannel();
fc.close();
你说最终会释放filePath所对应的系统资源吗?以避免出现内在泄漏。

还是我们最好这样做:
FileInputStream fis = new FileInputStream(filePath);
FileChannel fc = fis.getChannel();
fc.close(); //关闭管道
fis.close();//释放系统资料。

恭候大家来讨论。
...全文
354 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fansfirst2008 2010-04-21
  • 打赏
  • 举报
回复
如果程序仅仅用到了FC这个对象,那么前面的就足够了!
如果还需要对FIS这个对象处理的话,那么显然需要后面的!
但是目前它们都是等效的,根据简化原则,我选前面的
qulimin18 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 beiouwolf 的回复:]

汗。。。自己去看源代码
fis的
Java code

private FileChannel channel = null;
public FileChannel getChannel() {
synchronized (this) {
if (channel == null)
channel = FileChannelImpl.open(fd, ……
[/Quote]

这里是说在关闭fis流的时候会一同关闭连接此流的管道,多谢!这里我知道上面那种情况应该怎么关好了。就这样:
FileInputStream fis = new FileInputStream(filePath);
FileChannel fc = fis.getChannel();
fis.close(); //释放系统资源,关闭连接此流的管道。
因为有些nio的源码没找到,所以不敢肯定从关闭管道这边是怎样影响到它所连接到的流的。
sun.nio.ch.FileChannelImpl
beiouwolf 2010-04-21
  • 打赏
  • 举报
回复
第一,以你这个例子来说,怎么关都是一样的,因为操作的都是同一个channel,只是关一次和关两次的区别
不存在什么泄露问题
第二,如果是装饰器模式的话,实际上内部也是一样的,实际的文件句柄只有一个,不管你包裹几个实际上关一次就行了
qulimin18 2010-04-21
  • 打赏
  • 举报
回复
我认为引用系统资源的要将它明确声明出来,最后还要明确将它释放。
这样才能防止内存泄漏的发生。所以我认为第二种好一些(关闭管道的实现源码中并没有对fis流操作什么)。

多谢大家的回复。希望看到更多不同的见解。
beiouwolf 2010-04-21
  • 打赏
  • 举报
回复
汗。。。自己去看源代码
fis的

private FileChannel channel = null;
public FileChannel getChannel() {
synchronized (this) {
if (channel == null)
channel = FileChannelImpl.open(fd, true, false, this);
return channel;
}
}
public void close() throws IOException {
if (channel != null)
channel.close();
close0();
}


从外部获得的channel上关闭和一起关有区别吗。。。
zfq642773391 2010-04-21
  • 打赏
  • 举报
回复
从程序严谨上说,第二种更好,直接关闭流,第一种情况FileInputStream应该不会自动关闭,而是等垃圾收集器来处理它,容易出问题吧
代码下载地址: https://pan.quark.cn/s/a4b39357ea24 在计算机视觉技术,数据集扮演着训练和评估模型的核心角色。Labelme作为一个广受欢迎的开源工具,能够支持用户以交互方式对图像进行标注,而COCO(Common Objects in Context)则是一种被广泛采纳的数据集标准格式,适用于包括物体检测、图像分割在内的多种任务。本文将详细阐述如何将Labelme生成的标注数据转换为COCO数据集的标准格式。 Labelme标注的图像在输出为JSON格式时,会包含以下核心内容: 1. `version`: 指明JSON文件的版本信息。 2. `flags`: 目前未定义或保持为空,预留用于未来的功能扩展。 3. `shapes`: 列表形式存储对象的形状信息,每个形状项包含`label`(对象类别名称),`points`(构成对象边缘的多边形顶点),以及`shape_type`(通常为“polygon”)。 4. `imagePath`和`imageData`: 提供原始图像的存储路径和二进制数据,便于后续图像的还原。 5. `imageHeight`和`imageWidth`: 明确标注图像的垂直和水平尺寸。 COCO数据集的标准格式定义了三种主要的标注类型: 1. Object instances(目标实例):主要用于执行物体检测任务。 2. Object keypoints(目标上的关键点):适用于人体姿态估计相关应用。 3. Image captions(看图说话):用于生成图像的文本描述。 COCO的JSON结构包含以下基本组成部分: 1. `images`:记录图像的基本属性,包括`height`(高度)、`...
内容概要:本文围绕基于Basisformer模型的时间序列锂离子电池SOC(State of Charge,荷电状态)预测展开研究,利用PyTorch深度学习框架构建并训练模型,旨在提升锂电池SOC估计的准确性与鲁棒性。该方法融合Transformer架构的核心机制,通过引入基函数(Basis)分解策略,有效捕捉电池充放电过程长时序、非线性动态特征,增强模型对复杂工况的适应能力。研究不仅详细阐述了Basisformer的网络结构设计、注意力机制优化与训练程,还提供了完整的Python代码实现方案,涵盖数据预处理、模型搭建、损失函数定义、训练验证及结果可视化等环节,便于科研人员快速复现、调优并拓展至其他电池状态预测任务。; 适合人群:具备一定深度学习与Python编程基础,熟悉PyTorch框架,从事电池管理系统(BMS)、新能源汽车、储能系统、智能传感等领域的高校研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于动力电池与储能系统的实时SOC估算模块,提升系统安全性与能量利用效率;②作为学术研究的基础模型,用于复现、改进基于Transformer的时间序列预测方法在电化学系统应用;③为数据驱动的电池健康状态(SOH)、剩余使用寿命(RUL)联合估计提供可扩展的技术框架。; 阅读建议:建议读者结合所提供的代码与公开电池数据集(如NASA、CALCE等)进行动手实践,深入理解模型的输入输出结构与时序建模逻辑,同时可尝试引入温度、老化周期等多维特征,或融合物理模型构建混合预测架构,以进一步提升预测精度与泛化能力。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧