如何优雅的读取流

作者: youkale | 来源:发表于2016-06-22 23:50 被阅读361次

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程序员修炼之道

相关文章

  • 如何优雅的读取流

    Java中关于InputStream读取很多人立马就想到下面的写法: 下面这几个类都实现了Closeable,所以...

  • 翻译:CFNetwork编程指南(二)——使用流(Working

    本文讨论如何创建、打开和检查读写流错误。它还描述了如何从读取流读取信息,如何从写入信息到写入流,如何在读取或写入流...

  • java操作文件

    优雅读取文件 优雅的写入文件 读取大文件

  • Python Toolz 简易教程(2)-基本概念

    数据流 数据流就是以批量的形式读取、处理、存储巨量的数据。函数式编程为这种流处理提供了一种优雅、健壮的解决方案。 ...

  • 计算机视觉 OpenCV (2)

    今天分享的是如何通过 OpenCV 读写视频流。 读取视频流 这里 VideoCapture 方法参数 0 表示读...

  • 5、GeoTrellis-读取栅格文件

    读取单波段的栅格 读取多波段栅格 使用流读取栅格 通过流读取的tif,单个小文件可以完整的读取,大文件则Java虚...

  • Guava | IO

    一、Java IO 基于流的读取方式:只能顺序读取,不能随机读取

  • Topic21(字符流)

    21.01 字符流FileReader 字符流是什么字符流是可以直接读写字符的IO流字符流读取字符,就要先读取到字...

  • 文件流

    写入流 writeStream.txt 读取流 读取流与写入流结合 文件流管道

  • socket

    读取数据流的时候, 不可重复, 顺序读取

网友评论

    本文标题:如何优雅的读取流

    本文链接:https://www.haomeiwen.com/subject/rzyndttx.html