文件转字符串方式  ---  (环绕执行模式&行为参数化&函数式接口|Lambda表达式)

嗯,当然论方便的话,我们直接可以使用,

org.apache.commons.io.FileUtils;

String readFileToString(final File file, final String encoding)

这里作为一种思路学习 

首先我们讲几个概念:

  • 环绕执行模式:
    • 简单的讲,就是对于OI,JDBC等类似资源,在用完之后需要关闭的,资源处理时常见的一个模式是打开一个资源,做一些处理,然后关闭资源,这个设置和清理阶段类似,并且会围绕着执行处理的业务逻辑。这就是环绕执行模式
  • 行为参数化:
    • 函数式编程的一种思想,通过把代码包装为参数传递行为,即把代码逻辑包装为一个参数,传到方法里。
  • Lambda表达式:

    • Lambda表达式理解为简洁的表示可传递的匿名函数的一种方式,它没有名称,但它有函数体,参数列表,返回类型。可以抛出一个异常类型。包装代码逻辑为参数即使用Lambda表达式
  • 函数式接口:
    • 本质上是只有一个抽象方法的普通接口,可以被隐式的转换为Lambda表达式,需要用注解定义(@FunctionalInterface)默认方法和静态方法可以不属于抽象方法,可以在函数式接口中定义
    • 如果函数式接口中额外定义多个抽象方法那么这些抽象方法签名必须和Object的public方法一样,接口最终有确定的类实现, 而类的最终父类是Object。 因此函数式接口可以定义Object的public方法。
  • 关于更多的java8学习,《Java8实战》个人感觉这本书不错。也可以看看我的博客,《java8实战》读书笔记,里面有这本书的PDF资源
@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
}  

 

下面我们先看一个简单的环绕执行模式:

第一步;当需要更改逻辑代码是,需要重写代码,所以想到行为参数化

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

第二步,使用函数式接口来传递一个行为

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

第三步,执一个行为,任何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) ;

第四步,传递Lambda

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. String 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);
}

为了美观,我把异常抛了出去,这样好处:

  • 我们只需要关心具体的读取逻辑即可,不需要关心其他,
  • 可以用于文本处理,对读取的字符串进行过滤等操作。

不足之处希望小伙伴批评指教。生活加油..

如何优雅的将文件转换为字符串(环绕执行模式&行为参数化&函数式接口|Lambda表达式)的更多相关文章

  1. 将json文件转换为字符串

    //从给定位置读取Json文件    public   String readJson(String path){        //从给定位置获取文件        File file = new ...

  2. Fiddler或Charles文件转换为Jmeter可执行脚本

    解决脚本录制问题,可以将Fiddler或Charles转换成对应的Jmeter脚本,实现部分内容的参数化配置,通过修改部分参数或参数化可以对http协议的接口进行自动化测试或简单的压力测试 GitHu ...

  3. 将文件转换为base64字符串,然后还原

    package com.um.banks.xinlian.utils; import java.io.File; import java.io.FileInputStream; import java ...

  4. BCB常用文件与字符串函数

    VCL库函数简介 一.BORLAND C++ BUILDER VCL的内存管理函数 1. AllocMem 在队中分配指定字节的内存块,并将分配的每一个字节初始化为 0.函数原型如下: void * ...

  5. m文件转换为C/C++文件的编译、绘图、参数、打包问题总结

    在工程计算相关项目中,常常利用Matlab来完成计算.算法.绘图等功能.使用Matlab来完成这些功能非常简单,Matlab提供的m编程语言功能强大,代码量少.为了在自己的C/C++项目中加入这些功能 ...

  6. MD5算法【计算文件和字符串的MD5值】

    1. MD5算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易错).任何长度的任意内容都可以用MD5计算出散列值.MD5的前身:MD2.MD3.MD4.介绍工具:CalcMD5 ...

  7. php从数据库中取二进制流文件转换为图片,图片以二进制流存入数据库实现

    php从数据库中取二进制流文件转换为图片,图片以二进制流存入数据库实现 function data_uri($contents, $mime) { $base64 = base64_encode($c ...

  8. JAVA文件转换为Base64

    JAVA文件转换为Base64 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream ...

  9. C# 使用 wkhtmltopdf 把HTML文本或文件转换为PDF

    一.简介 之前也记录过一篇关于把 HTML 文本或 HTML 文件转换为 PDF 的博客,只是之前那种方法有些局限性. 后来又了解到 wkhtmltopdf.exe 这个工具,这个工具比起之前的那种方 ...

随机推荐

  1. vue的watch

    watch它可以用来监测Vue实例上的数据变动  尽量一张图解释清楚(尝试用圈圈区分关系): 写的很简单,watch本来就没啥东西我理解为响应式侦听全局变量 watch里绑定全局变量,被绑定全局变量发 ...

  2. Python魔法方法之 __call__

    前言 Python的魔法方法是指Python内部已经包含的,被双下划线所包围的方法,这些方法在特定的操作时会自动被调用.魔法方法可以使Python的自由度变得更高,当不重载魔法方法时它可以在规定的默认 ...

  3. 如何创建一个自定义的`ErrorHandlerMiddleware`方法

    在本文中,我将讲解如何通过自定义ExceptionHandlerMiddleware,以便在中间件管道中发生错误时创建自定义响应,而不是提供一个"重新执行"管道的路径. 作者:依乐 ...

  4. Silence主题 美观清爽的cnblog第三方主题

    为什么推荐? 才开通cnblog,但苦于官方主题都不是很好看,翻找Github的时候发现了这个项目Silence 这是预览地址 官方展示图片 安装中的坑 不显示公共模块.博文目录.博文签名.博文赞赏. ...

  5. nodejs中的并发编程

    从sleep的实现说起 在nodejs中,如果要实现sleep的功能主要是通过"setTimeout + promise"实现,也可以通过"循环空转"来解决.前 ...

  6. rpc框架dubbo学习入门及环境搭建(spring boot+Kotlin)

    学习之前,确保有以下知识基础: Java网络编程 Socket传输数据 IO流 rpc简介及实现 rpc是remote procedure call的简写,意思为远程过程调用. rpc应用较多的情景是 ...

  7. iOS 原生库(AVFoundation)实现二维码扫描,封装的工具类,不依赖第三方库,可高度自定义扫描动画及界面(Swift 4.0)

    Create QRScanner.swift file // // QRScanner.swift // NativeQR // // Created by Harvey on 2017/10/24. ...

  8. 扫描工具-Arachni

    ./arachni_console          #进入命令行模式 ./arachni_web               #启用web服务,进入web操作模式 [属于web 应用] http:/ ...

  9. go micro实战01:快速搭建服务

    背景 go-micro给我们提供了一个非常便捷的方式来快速搭建微服务,而且并不需要提前系统了解micro,下面用一个简单的示例来快速实现一个服务. 创建Proto文件 因为我们要做微服务,那么就一定有 ...

  10. 回文串的Manacher算法

    Manacher算法较传统算法的优化之处在于它对每个回文中心寻找回文半径的时候并不是都从半径为1开始找的,而是利用前面已经完成的任务,寻找一个初始的开始搜索的半径大小,复杂度是线性的. 参考博客:ht ...