Javaでのファイル変換の実装(サラウンド実行モードと動作のパラメーター化と関数型インターフェース|ラムダ式)

ファイルから文字列へのメソッド---(サラウンド実行モードと動作のパラメーター化と関数型インターフェース|ラムダ式)

もちろん、便利な場合は直接使用できますが、

org.apache.commons.io.FileUtils;

文字列readFileToString(最終ファイルファイル、最終文字列エンコーディング)

考え方としてここで学ぶ 

まず、いくつかの概念について説明します。

  • サラウンド実行モード:

    • 簡単に言えば、OI、JDBC、およびその他の同様のリソースの場合、それらは使い果たされた後に閉じる必要があります。リソース処理の一般的なモードは、リソースを開き、何らかの処理を行ってからリソースを閉じることです。この設定は次のようになります。クリーンアップフェーズ、および実行処理を取り巻くビジネスロジックこれがサラウンド実行モードです
  • 動作のパラメーター化:

    • 関数型プログラミングのアイデアは、コードをパラメーター受け渡し動作としてラップすること、つまり、コードロジックをパラメーターとしてラップしてメソッドに渡すことです。
  • ラムダ式:

    • ラムダ式は、渡すことができる無名関数を簡潔に表現する方法として理解されています。名前はありませんが、関数本体、パラメーターリスト、および戻り値の型があります。例外タイプをスローできます。パッケージングコードロジックは、パラメーターとしてLambda式を使用することです。
  • 機能インターフェイス:

    • 基本的に、これは1つの抽象メソッドのみを持つ通常のインターフェイスであり暗黙的にLambda式に変換できアノテーション(@FunctionalInterface )で定義する必要がありますデフォルトのメソッドと静的メソッドは抽象メソッドである必要はなく、関数型インターフェースで定義できます
    • 機能インターフェースがあれば、さらにより多くの抽象メソッドを定義しこれらの抽象メソッドの署名公開オブジェクトのメソッドは、同じである必要があり、最終的に実装究極親クラスがオブジェクトであることクラスを決定インターフェース。したがって、関数型インターフェースはObjectのパブリックメソッドを定義できます。
    • @FunctionalInterfacepublic
      interface ObjectMethodFunctionalInterface {
      void count(int i);
      String toString(); //same to Object.toString
      int hashCode(); //same to Object.hashCode
      boolean equals(Object obj); //same to Object.equals
      }
  • より多くのjava8学習について

まず、単純なサラウンド実行モードを見てみましょう。

1)最初のステップ。ロジックコードを変更する必要がある場合は、コードを書き直す必要があるため、動作のパラメータ化が考慮されます。

public static String processFile()throws IOException {
        try(BufferedReader bufferedReader =
                new BufferedReader(new FileReader("data.txt"))){
           // return  bufferedReader.readLine();
            return  bufferedReader.readLine()+bufferedReader.readLine();
        }


2)2番目のステップは、関数型インターフェースを使用して動作を渡すことです

@FunctionalInterface
    public  interface BufferReaderProcessFile{
        // 方法签名为 BufferReader -> String
        String peocess(BufferedReader bufferedReader)throws IOException;
    }


3)3番目のステップは、アクションを実行することです。任意のBufferReader-> StringLambda式をパラメーターとして渡すことができます。それがpeocessメソッドの署名に準拠している限り。

 public static String processFiles(BufferReaderProcessFile bufferReaderProcessFile)throws IOException {
        try(BufferedReader bufferedReader =
                    new BufferedReader(new FileReader("data.txt"))){
             return bufferReaderProcessFile.peocess(bufferedReader) ;

 

 4)4番目のステップ、ラムダを通過します

String string = processFiles((BufferedReader bs) ->bs.readLine());

ファイルを文字列に変換する

私の考えでは、私はJava IOにあまり詳しくありません。良い方法があれば、メッセージを残してお互いから学んでください

  1. FileInputStream fileInputStream = new FileInputStream(file))
  2. InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream))
  3. BufferedReader bufferedReader = new BufferedReader(inputStreamReader))
  4. 文字列str = bufferedReader.readLine()
  5. バイトストリーム-「文字ストリーム-」文字バッファストリームは、バイトストリームを文字ストリームに変換し、それを高度なストリームでラップしようとしています。

したがって、私の考えは、ロジック内のIOストリームのクロージャと例外キャプチャが多すぎるのを避け、次の2つのテクノロジを組み合わせて、読み取りロジックの処理に集中することです。

  • try(){} [ストリームを自動的に閉じる、1.7サポート]
  • 達成するためのラムダ機能[動作パラメータ化、1.8]

ステップ:

機能インターフェイス転送動作の定義:

package com.liruilong.demotext.service.utils.interfaceutils;

import java.io.BufferedReader;
import java.io.IOException;

/**
 * @Description : 函数接口,描述BufferedReader ->String的转化方式
 * @Author: Liruilong
 * @Date: 2020/3/17 15:44
 */
@FunctionalInterface
public interface InputStreamPeocess {
    /**
     * @Author Liruilong
     * @Description 方法签名 BufferedReader ->String
     * @Date 15:47 2020/3/17
     * @Param [inputStream]
     * @return com.liruilong.demotext.service.utils.InputStream
     **/

    String peocess(BufferedReader bufferedReader) throws IOException;
}

アクションを実行するために、任意のBufferReader-> StringLambda式をパラメーターとして渡すことができます。それがpeocessメソッドの署名に準拠している限り。

 /**
     * @return java.lang.String
     * @Author Liruilong
     * @Description 环绕处理
     * @Date 17:14 2020/3/17
     * @Param [inputStreamPeocess, file]
     **/

    public static String fileToBufferedReader(InputStreamPeocess inputStreamPeocess, File file) {
        try (FileInputStream fileInputStream = new FileInputStream(file)) {
            try (InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream)) {
                try (BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
                    return inputStreamPeocess.peocess(bufferedReader);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            return null;
        }
    }

ラムダを実行する

/**
     * @return java.lang.String
     * @Author Liruilong
     * @Description 文件转字符串
     * @Date 17:22 2020/3/17
     * @Param [file]
     **/

    public static String readJsonToString(File file) {
        return string = fileToBufferedReader((bufferedReader) -> {
            String str = null;
            StringBuilder stringBuilder = new StringBuilder();
            while ((str = bufferedReader.readLine()) != null) {
                stringBuilder.append(str);
            }
            return stringBuilder.toString();
        }, file);
    }

そのような利点:

  • 特定の読み取りロジックだけを気にする必要があり、他のことを気にする必要はありません。
  • テキスト処理、読み取り文字列のフィルタリング、およびその他の操作に使用できます。

友達が欠点を批判してアドバイスしてくれることを願っています。人生を続けてください。

おすすめ

転載: blog.csdn.net/sanhewuyang/article/details/105449221