如何优雅的读取流

Java中关于InputStream读取很多人立马就想到下面的写法:

        InputStream inputStream = null;
        InputStreamReader reader = null;
        BufferedReader bufferedReader = null;
        try {
            inputStream = new FileInputStream("/home/0x1024/1024.txt");
            reader = new InputStreamReader(inputStream);
            bufferedReader = new BufferedReader(reader);
            String temp;
            StringBuilder sb = new StringBuilder();
            while (null != (temp = bufferedReader.readLine())) {
                sb.append(temp);
            }
            System.out.print(sb.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != inputStream){
                inputStream.close();
            }
            if (null != reader){
                reader.close();
            }
            if (null != bufferedReader){
                bufferedReader.close();
            }
        }

下面这几个类都实现了Closeable,所以读取完毕后都需要关闭。

        InputStream inputStream
        InputStreamReader reader;
        BufferedReader bufferedReader;

最终读取成功失败与否,还需要将这个流关闭掉,然后又是一陀臃肿的代码

            if (null != inputStream){
                inputStream.close();
            }
            if (null != reader){
                reader.close();
            }
            if (null != bufferedReader){
                bufferedReader.close();
            }

很多朋友估计每天都在承受这样的痛苦,不过自从JDK7发布以来,Closeable 接口扩展了一个叫 AutoCloseable的接口.

public interface Closeable extends AutoCloseable {    
        void close() throws IOException;
}

那么上面的这个文件读取可以很C#地写出:

     try (InputStream inputStream = new FileInputStream("/home/0x1024/1024.txt");
             InputStreamReader reader = new InputStreamReader(inputStream);
             BufferedReader bufferedReader = new BufferedReader(reader)) {
            String temp;
            StringBuilder sb = new StringBuilder();
            while (null != (temp = bufferedReader.readLine())) {
                sb.append(temp);
            }
            System.out.print(sb.toString());
        }catch (IOException e){
            e.printStackTrace();
        }

这样就完了吗???现在都已经JDK8了, 好的常用类都扩展了Steam,比如BufferedReader,有一个public Stream<String> lines()方法,那么上面的的代码就可以更优雅了.

    try (InputStream inputStream = new FileInputStream("/home/0x1024/1024.txt");
             InputStreamReader reader = new InputStreamReader(inputStream);
             BufferedReader bufferedReader = new BufferedReader(reader)) {
            System.out.println(bufferedReader.lines().collect(Collectors.joining()));
        }catch (IOException e){
            e.printStackTrace();
        }

是的,你没看错。。。就那么点代码了!!!

只要你的jdk是7以上,只要实现了 Closeable 就可以用 try(...){...} 的方式撸代码了.

后话

更偷懒的朋友可能会这样写:

        try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("/home/0x1024/1024.txt")))) {
            System.out.println(bufferedReader.lines().collect(Collectors.joining()));
        }catch (IOException e){
            e.printStackTrace();
        }

那么我告诉你,这样写是不正确的,详情请阅读:JAVA程序员修炼之道

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原链接:http://www.cnblogs.com/langtianya/p/3757993.html JDK各...
    把爱放下会走更远阅读 1,133评论 0 10
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,805评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,394评论 11 349
  • 撒谎有时候是真相不能公布的遮羞布,一旦这块遮羞布被揭开,真相是丑陋的不堪的,或者是不愿的。既然如此,那块遮羞布为什...
    持谦守中阅读 178评论 0 0
  • 【本文由陶瓷秦大师原创,转载请保留版权!】 近几年接触了不少酿酒者和酒类经营者,也见证了他们从〝小〝到〝大〝的过程...
    陶瓷秦大师阅读 5,626评论 0 0