どのように優雅な読み取りストリーム

3537 ワード

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();
            }

多くの友人は毎日このような苦痛に耐えていると推定しているが、JDK 7の発表以来、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();
        }

これで終わりですか???今すでにJDK 8になって、良い常用クラスはすべてSteamを拡張して、例えばBufferedReader、1つのpublic Stream 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プログラマーの修練の道を読んでください.