Java에서 파일 변환 구현 (서라운드 실행 모드 및 동작 매개 변수화 및 기능 인터페이스 | Lambda 표현식)

파일 대 문자열 메서드 --- (주변 실행 모드 및 동작 매개 변수화 및 기능 인터페이스 | Lambda 식)

물론 편리하다면 직접 사용할 수 있습니다.

org.apache.commons.io.FileUtils;

String readFileToString (최종 파일 파일, 최종 문자열 인코딩)

여기에서 생각하는 방법으로 배우십시오 

먼저 몇 가지 개념에 대해 이야기합니다.

  • 서라운드 실행 모드 :

    • 간단히 말해서 OI, JDBC 및 기타 유사한 리소스의 경우 사용 된 후 닫아야합니다. 리소스 처리의 공통 모드는 리소스를 열고 일부 처리를 수행 한 다음 리소스를 닫는 것입니다.이 설정은 다음과 유사합니다. 정리 단계, 그리고 실행 처리를 둘러싼 비즈니스 로직 입니다. 이것이 서라운드 실행 모드 입니다.
  • 동작 매개 변수화 :

    • 함수형 프로그래밍의 아이디어는 코드를 매개 변수 전달 동작으로 래핑하는 것입니다. 즉, 코드 논리를 매개 변수로 래핑하고 메서드에 전달하는 것입니다.
  • 람다 식 :

    • Lambda 표현식은 전달할 수있는 익명 함수 를 간결하게 표현 하는 방법 으로 이해됩니다 . 이름은 없지만 함수 본문, 매개 변수 목록 및 반환 유형이 있습니다. 예외 유형이 발생할 수 있습니다. 패키징 코드 로직은 Lambda 표현식을 파라미터로 사용하는 것입니다 .
  • 기능적 인터페이스 :

    • 본질적으로 이것은 하나의 추상 메서드있는 일반 인터페이스 이며, 묵시적으로 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 학습에 대해 ,

    • "Java8 Actual Combat"는 개인적으로이 책이 좋다고 느낍니다. 또한 내 블로그 "java8 actual combat"읽기 노트 를 볼 수 있습니다.이 책에 대한 PDF 리소스가 있습니다.

먼저 간단한 서라운드 실행 모드를 살펴 보겠습니다.

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) 두 번째 단계는 기능적 인터페이스를 사용하여 동작을 전달하는 것입니다.

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


3) 세 번째 단계는 작업을 수행하는 것입니다. 모든 BufferReader-> String Lambda 표현식을 매개 변수로 전달할 수 있습니다. peocess 방법의 서명을 따르는 한.

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

 

 4) 네 번째 단계, 람다 통과

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

파일을 문자열로 변환

내 생각에는 Java IO에 익숙하지 않습니다 . 좋은 방법이 있다면 메시지를 남기고 서로 배우십시오 .

  1. FileInputStream fileInputStream = 새 FileInputStream (파일))
  2. InputStreamReader inputStreamReader = 새로운 InputStreamReader (fileInputStream))
  3. BufferedReader bufferedReader = new BufferedReader (inputStreamReader))
  4. 문자열 str = bufferedReader.readLine ()
  5. 바이트 스트림- "문자 스트림-"문자 버퍼 스트림은 바이트 스트림을 문자 스트림으로 변환 한 다음 고급 스트림으로 래핑하려고합니다.

따라서 제 생각은 논리에서 너무 많은 IO 스트림 폐쇄 및 예외 캡처를 피하고 다음 두 기술을 결합하여 읽기 논리 처리에 집중하는 것입니다.

  • try () {} [스트림 자동 닫기, 1.7 지원]
  • 달성 할 Lambda 기능 [동작 매개 변수화, 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-> String Lambda 표현식을 파라미터로 전달할 수 있습니다. 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;
        }
    }

Lambda 실행

/**
     * @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