파일 대 문자열 메서드 --- (주변 실행 모드 및 동작 매개 변수화 및 기능 인터페이스 | 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에 익숙하지 않습니다 . 좋은 방법이 있다면 메시지를 남기고 서로 배우십시오 .
- FileInputStream fileInputStream = 새 FileInputStream (파일))
- InputStreamReader inputStreamReader = 새로운 InputStreamReader (fileInputStream))
- BufferedReader bufferedReader = new BufferedReader (inputStreamReader))
- 문자열 str = bufferedReader.readLine ()
- 바이트 스트림- "문자 스트림-"문자 버퍼 스트림은 바이트 스트림을 문자 스트림으로 변환 한 다음 고급 스트림으로 래핑하려고합니다.
따라서 제 생각은 논리에서 너무 많은 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);
}
이러한 이점 :
- 우리는 특정한 읽기 논리에만 신경을 쓰면되고 다른 것들에는 신경 쓸 필요가 없습니다.
- 텍스트 처리, 읽기 문자열 필터링 및 기타 작업에 사용할 수 있습니다.
친구들이 단점을 비판하고 조언 해주길 바랍니다. 어서 ..