JAVA 输入流 or 输出流 && 程序性能分析

1、Java Visual VM

JAVA 性能分析工具
https://www.cnblogs.com/linghu-java/p/5689227.html
去idea 、jdk 的bin目录下面找 .exe (具体说明看链接)

2、先关闭输出流 or 输入流?

1)先开后关,先开的输入流,再开的输出流,通过读取输入流写入输出流中,那么应该先关输出流,再关输入流,但是一般关闭输入输出流操作都是在读写完成后的finally中执行的,所以即使先关输入流,再关输出流也不会任何问题,因为读写操作没有进行了。
2)先关外层,再关内层。如BufferedInputStream包装了一个FileInputStream,那么先关BufferedInputStream,再关FileInputStream。但要注意的是由于一般处理流持有节点流引用,处理流都会在自己的close方法中去关闭节点流,因此我们只要关闭外层的处理流即可,如果多此一举的关闭节点流反而会报错。如BufferedInputStream包装了FileInputStream,我们只要关闭BufferedInputStream即可。

3)只关处理流,不关节点流,原因见上述第二条。

流相关文章参考:http://blog.csdn.net/u012250875/article/details/78341874

3、 输出输出流具体操作

因为OutputStream的各种write()方法可能会抛出IO异常,而不能将流关闭,三种情况的正确操作,能将流真正关闭:

1)在finally中关流

OutputStream out = null;
try{
    File file = new File("D:\\file.txt");
    out = new FileOutputStream(file);
    // ...操作流
}catch(Exception e){
    e.printStackTrace();
} finally {
    try {
        if(out != null){
            out.close();
        }
    }catch (Exception e){
        e.printStackTrace();
    }
}

2)在关闭多个流时,用1个try去关闭1个流

OutputStream out1 = null;
OutputStream out2 = null;
try{
    File file = new File("D:\\file.txt");
    out1 = new FileOutputStream(file);
    out2 = new FileOutputStream(file);
    // ...操作流
}catch(Exception e){
    e.printStackTrace();
} finally {
    // 先try关闭第一个
    try {
        if(out1 != null){
            out1.close();
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    // 再try关闭第二个
    try {
        if(out2 != null){
            out2.close();
        }
    }catch (Exception e){
        e.printStackTrace();
    }
}

3)在循环中创建多个流,for()循环在外层try{}在内层,并在try{}中创建流。

for(int i=0; i<3; i++){
    OutputStream out = null;
    try{
        File file = new File("D:\\file.txt");
        out = new FileOutputStream(file);
        // ...操作流
    } catch(Exception e){
        e.printStackTrace();
    } finally {
        try {
            if (out != null) {
                out.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

原文链接:https://blog.csdn.net/csdjia11/article/details/107704091

补充说明:assert 关键字

下面的两端代码是等价的:

finally {
        try {
            if (out != null) {
                out.close();
            }  }  }
assert outputStream_Writer != null;
outputStream_Writer.close();  
1)assert的介绍

Java中有一个不太常用的关键字assert,是jdk1.4中加入的,平时开发中见的很少,不过在一些框架的源码里面的测试类里面,出现过不少它的踪迹。

assert意为断言的意思,这个关键字可以判断布尔值的结果是否和预期的一样,如果一样就正常执行,否则会抛出AssertionError。

2)assert的作用

assert的作用类似下面的一段代码:

boolean flag=false;;
assert flag;

等于下面的代码:

if (!flag)
throw new AssertionError();

3)assert有两种用法:

(1)asset expression1;
在这里插入图片描述

(2)asset expression1 : expression2;
在这里插入图片描述

注意,在运行的时候,正常情况下assert是不会生效的,因为运行时assert是关闭的,想要使用,必须在VM启动参数中开启:

-enableassertions 或者 -ea

在这里插入图片描述

这里基本能够看出来,使用assert命令来检验变量是比较精简的,不用像if语句那样。

既然assert能够精简的判断一些case,那么是不是所有的判断都应该使用assert判断呢?

实际上并不是这样,因为在运行时默认是关闭assert的,因为开启assert校验,也会损耗一定的性能,并且如果在关键部分的校验使用了assert验证,但是忘记开启assert功能,那么肯定会造成重大的失误,所以在生产环境下的代码,是不建议使用assert功能的,一般都是在测试类里面使用的比较多。
在这里插入图片描述
原文链接:https://cloud.tencent.com/developer/article/1399543

原文链接:https://blog.csdn.net/jeikerxiao/article/details/82262487

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值