java TWR是怎么优雅我们的代码的?

article/2025/10/7 20:38:47

我们在编写IO代码的时候,有的时候真的是对对java IO那种模板化的代码感到厌倦,而且写出来的代码,很臃肿丑陋。像下面这样的代码:

   public void readFile(String filePath) {FileInputStream fis = null;InputStreamReader inReader = null;BufferedReader br = null;try {fis = new FileInputStream(filePath);inReader = new InputStreamReader(fis);br = new BufferedReader(inReader);for (String line; (line = br.readLine()) != null; ) {//TODO} } catch (IOException e) {e.printStackTrace();} finally  {if (null != fis) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}if (null != inReader) {try {inReader.close();} catch (IOException e) {e.printStackTrace();}}if (null != br) {try {br.close();} catch (IOException e) {e.printStackTrace();}}}}

真的是看花眼啊,尤其是那个finally块,太长了。而且有的时候,忘记关闭资源,导致资源被耗尽,程序出现异常,还得各种定位问题。

java1.7带来了一个新特性,即TWR(Try-With-Resource)语法,我们可以不用去管那finally块了,只需将上面的代码改写成这样即可。

    public void readFile(String filePath) {try (FileInputStream fis = new FileInputStream(filePath);InputStreamReader inReader = new InputStreamReader(fis);BufferedReader br = new BufferedReader(inReader);) {for (String line; (line = br.readLine()) != null; ) {//TODO} } catch (IOException e) {e.printStackTrace();} }

即,在try()括号内初始化IO变量。这样来看,代码一下子精简不少。我们再也不用关注那臃肿的finally块了。

那么java1.7是怎么做到的呢?我们将上面的代码,放到TWR.java源文件中,并import相应的类,然后在JDK1.7.0_80用javac编译一下,得到TWR.class文件。如图:

借助于IDEA,我们反编译了这份字节码文件,看看javac都为我们做了什么。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;public class TWR {public TWR() {}public void readFile(String var1) {try {FileInputStream var2 = new FileInputStream(var1);Throwable var3 = null;try {InputStreamReader var4 = new InputStreamReader(var2);Throwable var5 = null;try {BufferedReader var6 = new BufferedReader(var4);Throwable var7 = null;try {while(true) {if (var6.readLine() != null) {continue;}}} catch (Throwable var54) {var7 = var54;throw var54;} finally {if (var6 != null) {if (var7 != null) {try {var6.close();} catch (Throwable var53) {var7.addSuppressed(var53);}} else {var6.close();}}}} catch (Throwable var56) {var5 = var56;throw var56;} finally {if (var4 != null) {if (var5 != null) {try {var4.close();} catch (Throwable var52) {var5.addSuppressed(var52);}} else {var4.close();}}}} catch (Throwable var58) {var3 = var58;throw var58;} finally {if (var2 != null) {if (var3 != null) {try {var2.close();} catch (Throwable var51) {var3.addSuppressed(var51);}} else {var2.close();}}}} catch (IOException var60) {var60.printStackTrace();}}
}

通过这份反编译代码,我们知道了,原来是javac在编译的时候,悄悄地为我们加上了finally块,而且它的写法更加安全。

在java类库中,也有很多TWR的身影,像java.nio.file.Files类的readAllLines()方法:

代码截取自JDK_1.9.0.1的源码:

    public static List<String> readAllLines(Path path, Charset cs) throws IOException {try (BufferedReader reader = newBufferedReader(path, cs)) {List<String> result = new ArrayList<>();for (;;) {String line = reader.readLine();if (line == null)break;result.add(line);}return result;}}

【总结】:TWR写法告诉了编译器javac,自动的为我们增加了资源关闭代码。

【问题】:如果不采用TWR写法,那么关闭顺序是怎么定的呢?


http://chatgpt.dhexx.cn/article/qQFNPYm4.shtml

相关文章

基于UWB的室内SDS_TWR测距算法优化和定位算法融合的研究

1、内容简介 略257 2、内容说明 1、RSSI定位方法 基于接收信号强度RSS(Receive Signal Strength)[57]方法通过三个及以上己知位置的锚节点来测量移动节点发射的信号场强强度&#xff0c;从而通过己有的传播损耗模型来估算移动节点距锚节点的距离&#xff0c;从而实现位置测量…

UWB-DW1000的TWR测距及代码(五)

UWB测距过程很简单&#xff0c;两个设备&#xff08;A和B&#xff09;。设备A先发送&#xff0c;设备B等待接收 设备A 发送 P 给 设备B&#xff0c;此时读取时间戳&#xff0c;也可以等收到应答再进行读取&#xff0c;发送时间戳和接收时间戳都会保留最新一次&#xff0c;只要…

UWB DW1000 TWR测距定位功能实现

3基站对1标签进行测距的流程如下&#xff1a; 1、标签发起测距poll&#xff0c;等待3个基站的回应resp&#xff1b;依次收到3个基站的resp后&#xff0c;发送携带时间戳的final&#xff1b; 2、基站等待poll&#xff1b;收到poll后&#xff0c;发送resp&#xff0c;再继续等待…

hp 800 g4 twr linux,【拆机】HP EliteDesk 800 G4 TWR—探究塔式机箱的秘密

惠普商务台式机在专业领域口碑一直强势,其优良的结构设计与出色的稳定性素来为用户所青睐。今天的拆机要为大家带来的是——HP EliteDesk 800 G4 TWR。这款商务台式机内部做工到底如何?今天我就为大家带来答案。 按照惯例先为大家介绍一下这款产品的外观。 作为一台商务台式机…

uwb最详细的DS-TWR测距

简介 •测距、定位和数据传输。 •利用双向测距&#xff08;TOF&#xff09;测量或单向到达时间差&#xff08;TDOA&#xff09;到达时间差&#xff0c;误差在10cm&#xff0c;经过一定的滤波可以达到更低。 •跨越 3.5 GHz 至 6.5 GHz 的 6 个 RF 频段。 •支持 110 kbps&…

DRAM知识整理系列(三):部分时序参数整理

目录 一、时序参数整理 第一时序&#xff1a; 1、tCL - CAS Lantency Control 2、tRCD - RAS to CAS Delay 3、tRP - Row Precharge Timing 4、tRAS - RAS Active Time 第二时序&#xff1a; 5、CWL - CAS Write Latency 6、tRC - Row Cycle Time 7、tRFC - Row Refr…

超宽带(UWB)学习笔记——TWR测距

文章目录 前言1. 单边双向测距&#xff08;SS-TWR, Single Side - Two Way Ranging&#xff09;1.1 测距方式1.2 误差分析 2 双边双向测距&#xff08;DS-TWR, Double Side - Two Way Ranging&#xff09;2.1 测距方式2.2 误差分析 参考文献 前言 TOF&#xff08;Time Of Figh…

UWB定位的3种算法:TWR、TOA和TDOA算法

UWB定位的3种算法&#xff1a;TWR、TOA和TDOA算法 文章目录 UWB定位的3种算法&#xff1a;TWR、TOA和TDOA算法UWB定位技术一、TER定位算法二、 TOA定位算法三、 TDOA定位算法相关链接 UWB定位技术 UWB 定位原理和卫星导航定位原理相类似&#xff0c;由多个定位基站和定位标签组…

【提高准确率方法总结】

文章目录 1.数据集扩增2.增大数据集差异性&#xff0c;随机性3.使用tensor transform对数据进行预处理4.调节batch_size大小5.设置shuffleTrue6.调节学习率&#xff08;learning rate&#xff09;7.权重衰减 &#xff08;weight_decay&#xff09;8.适当增加训练轮次&#xff0…

准确率、召回率和mAP、AP50/75

1、准确率和召回率 真实值与预测值之间的关系如下左图所示&#xff0c;右图是二者之间的一个直观表示&#xff0c;同时也能清晰的看出准确率和召回率的具体含义。准确率 P P P 给出了“预测为真值的样本中确实有多少比例为真值”&#xff0c;召回率 R R R 则给出了“本来就是…

如何区分精确率(precision)、准确率(accuracy)和召回率(recall)

理解精确率(precision)、准确率(accuracy)和召回率&#xff08;recall&#xff09; 正样本 负样本 预测正例 TP FP 预测反例 FN TN TN&#xff0c;预测是负样本&#xff0c;预测对了 FP&#xff0c;预测是正样本&#xff0c;预测错了 FN&#xff0c;预测是负样本&am…

pytorch_cifar10 学习记录(91%准确率)

目录 一、首次尝试深度学习 1.1训练参数 网络结构&#xff1a; 1.2训练结果 1.3 总结 二、修改网络和学习率&#xff0c;初次使用GPU炼丹&#xff08;kaggle线上炼丹&#xff09; 2.1训练参数 三、cifar10数据增强后进行炼丹 3.1 参数设置 3.2训练记录 3.2.1 0-100轮…

精度评定中的准确率(Precision)和召回率(Recall)

在模式识别中&#xff0c;我们经常会使用到一些指标对目标识别或者影像分类的结果进行评价。 假设我们需要将一个样本集分类为苹果和非苹果两类&#xff0c;那么分类结果有四种情况&#xff1a; 第一种情况&#xff1a;True Positive&#xff0c;本来就是苹果被分类成苹果&…

机器学习:什么是召回率、准确率和精确率?

在机器学习中&#xff0c;经常会听到准确率、召回率及精确率三个专业评价指标&#xff0c;刚开始接触时&#xff0c;总是会傻傻的分不清&#xff0c;今天之后&#xff0c;就能准确区分了&#xff01; —准确率&#xff1a;就是在预测的所有样本中预测正确的比率&#xff08;包…

准确率、精度和召回率

原文链接 精度&#xff08;查准率&#xff09;和召回率&#xff08;查全率&#xff09;是衡量机器学习模型性能的重要指标&#xff0c;特别是数据集分布不平衡的案例中。 什么是分布不平衡的数据集&#xff1f; 倘若某人声称创建一个能够识别登上飞机的恐怖分子的模型&#…

深度学习提高模型准确率方法

这里写目录标题 深度学习数据使用更多数据更改图像大小减少颜色通道 算法模型改进增加训练轮次迁移学习添加更多层调整超参数 总结 深度学习 我们已经收集好了一个数据集&#xff0c;建立了一个神经网络&#xff0c;并训练了模型&#xff0c;在测试和验证阶段最后得到的准确率…

准确率、精准率和召回率的理解

我们在在分类任务时&#xff0c;经常会对模型结果进行评估。评估模型好坏的指标有AUC、KS值等等。这些指标是通过预测概率进行计算的。而准确率、精准率和召回率也通过混淆矩阵计算出来的。下图是对混淆矩阵的介绍&#xff1a; 其中&#xff0c; TP&#xff1a;样本为正&#…

准确率召回率

http://blog.sina.com.cn/s/blog_4b59de070100ehl7.html 最近一直在做相关推荐方面的研究与应用工作&#xff0c;召回率与准确率这两个概念偶尔会遇到&#xff0c; 知道意思&#xff0c;但是有时候要很清晰地向同学介绍则有点转不过弯来。 召回率和准确率是数据挖掘中预测、互…

准确度(accuracy)、精确率(precision)、召回率(recall)、F1值 谈谈我的看法

目录 前言 基本概念 准确率 Accuracy 精确度 Precision 召回率 Recall F1 值 sklearn 的评估函数 pyspark 的评估函数 tensorflow 的评估函数 多分类下的评估 前言 准确度、精确率、召回率、F1值作为评估指标&#xff0c;经常用到分类效果的评测上。比较好理解的二分…

准确率,精确率,召回率和F1值

机器学习(ML),自然语言处理(NLP),信息检索(IR)等领域,评估(Evaluation)是一个必要的 工作,而其评价指标往往有如下几点:准确率(Accuracy),精确率(Precision),召回率(Recall)和F1-Measure。 (注&#xff1a; 相对来说&#xff0c;IR 的 ground truth 很多时候是一个 Ordered Lis…