一.前言

今天整理笔记,发生笔记中很多代码和笔记的标点符号是中文符号,所以写了个很简单的代码实现中文标点符号改成英文标点符号,读写文件涉及到io流,传统io流使用起来不是很方便,代码量多,难记!(赶时间的直接看三.最终版即可,二传统io流读写md,txt文件可以跳过)

二.传统io流读写md,txt文件

思路一:是先用缓冲流读取文件,读一行改一行,再输出到另一文件中(同时读取同一个文件容易出错)

import java.io.*;public class DocumentAlter {public static void documentAlter(String src,String dest) {long startTime = System.currentTimeMillis(); //获取开始时间String encoding = "utf8";File fileSrc = new File(src);File fileDest = new File(dest);try(InputStreamReader read = new InputStreamReader(new FileInputStream(fileSrc), encoding);BufferedReader bufferedReader = new BufferedReader(read);BufferedWriter bw = new BufferedWriter(new FileWriter(fileDest,true));) {//上条语句,true表示追加在文档后面,不覆盖;flase表示覆盖if (fileSrc.isFile() && fileSrc.exists()) { //判断读取的源文件是否存在String lineTxt = null;while ((lineTxt = bufferedReader.readLine()) != null) {String str = DocumentAlter.punctuationMarksAlter(lineTxt);bw.write(str);bw.newLine();//此处不写就没有换行bw.flush();}long endTime = System.currentTimeMillis(); //获取结束时间System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间} else {System.out.println("找不到指定的文件");}} catch (Exception e) {System.out.println("读写过程中出错");e.printStackTrace();}}/*** 英文标点符号替换成中文的* @param str* @return*/public static String punctuationMarksAlter(String str) {str = str.replaceAll("(", "(").replaceAll(")", ")").replaceAll(";", ";").replaceAll("“", "\"").replaceAll("”", "\"").replaceAll(":", ":").replaceAll("?", "?").replaceAll(",", ",");return str;}public static void main(String argv[]) {String filePath = "D:\\note\\jvm\\jvm入门.md";String fileDest = "D:\\workspace\\jvm\\chapter05\\src\\main\\java\\a.md";documentAlter(filePath,fileDest);}
}


我的笔记335KB,程序运行时间:185ms

注意:这里使用了JDK7的try with resource语法糖可以实现资源的自动关闭,但是要求执行后必须关闭的所有资源必须在try子句中初始化,否则编译不通过。java9取消了这个限制(需要关闭的资源可以放在try的小括号外)。此时的资源属性是个常量,已声明为final,不可修改,括号里的多个资源用分号隔开。

思路二:读取-修改-拼接到StringBuilder-BufferedWriter输出到文件
先用缓冲流把文件读到String字符串,标点符号改完后直接拼接到一个StringBuilder中,最后再BufferedWriter输出到任意文件

import java.io.*;public class DocumentAlter {public static void documentAlter(String src,String dest) {//StringBuffer线程安全,StringBuilder线程不安全,经过测试,单线程使用StringBuilder更快StringBuilder sb = new StringBuilder();String encoding = "utf8";File fileSrc = new File(src);File fileDest = new File(dest);try(InputStreamReader read = new InputStreamReader(new FileInputStream(fileSrc), encoding);BufferedReader bufferedReader = new BufferedReader(read);BufferedWriter bw = new BufferedWriter(new FileWriter(fileDest,true));) {if (fileSrc.isFile() && fileSrc.exists()) { //判断读取的源文件是否存在String lineTxt = null;long startTime = System.currentTimeMillis(); //获取开始时间while ((lineTxt = bufferedReader.readLine()) != null) {//把String进行文本处理,然后添加换行符String str = DocumentAlter.punctuationMarksAlter(lineTxt) + System.getProperty("line.separator");sb.append(str);}bw.write(sb.toString());bw.flush();long endTime = System.currentTimeMillis(); //获取结束时间System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间} else {System.out.println("找不到指定的文件");}} catch (Exception e) {System.out.println("读写过程中出错");e.printStackTrace();}}/*** 英文标点符号替换成中文的** @param str* @return*/public static String punctuationMarksAlter(String str) {str = str.replaceAll("(", "(").replaceAll(")", ")").replaceAll(";", ";").replaceAll("‘", "'").replaceAll("’", "'").replaceAll("“", "\"").replaceAll("”", "\"").replaceAll(":", ":").replaceAll("?", "?").replaceAll("【", "[").replaceAll("】", "]").replaceAll("!", "!").replaceAll(".", ".").replaceAll(",", ",");return str;}public static void main(String argv[]) {String filePath = "D:\\note\\jvm\\jvm入门.md";String fileDest = "D:\\workspace\\jvm\\chapter05\\src\\main\\java\\a.md";documentAlter(filePath,fileDest);}
}

程序运行时间:138ms
StringBuilder拼接的方式比第一种先读取后写入快一些,另外如果String替换StringBuilder拼接的方式,需要1000ms,对大字符串拼接的方式最好使用StringBuilder。

测试文件我改成10000kb,第二种StringBuilder拼接的方式700ms比第一种先读取后写入1500ms快很多,文件越大效果越明显

三.最终版

以上两种方法也够用了,我发现了个io很好用的工具包-commons-io,在pom中导入依赖即可(导包的时候有两个包,要导apache的,别导错了。

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.8.0</version>
</dependency>
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;import java.io.*;public class DocumentAlter {/**** @param src 源文件* @param dest  目标文件*/public static void documentAlter(String src,String dest) {long startTime = System.currentTimeMillis(); //获取开始时间//编码String encoding = "UTF-8";File fileSrc = new File(src);File fileDest = new File(dest);try(FileInputStream fis =new FileInputStream(fileSrc)) {if (fileSrc.isFile() && fileSrc.exists()) { //判断读取的源文件是否存在//读取源文件到String字符串中String srcString = IOUtils.toString(fis,encoding);//进行文本处理比如标点符号修改等等String afterAlterString = DocumentAlter.punctuationMarksAlter(srcString);//把字符串写到目标文件中(目的地,字符串,编码格式)FileUtils.writeStringToFile(fileDest,afterAlterString,encoding);long endTime = System.currentTimeMillis(); //获取结束时间System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间} else {System.out.println("找不到指定的文件");}} catch (Exception e) {System.out.println("读写过程中出错");e.printStackTrace();}}/*** 英文标点符号替换成中文的,可以省内存,整理文档*中文输入法里的标点符号比如();“”无需加\而英文输入法中要在加\转义* @param str* @return*/public static String punctuationMarksAlter(String str) {str = str.replaceAll("(", "(").replaceAll(")", ")").replaceAll(";", ";").replaceAll("“", "\"").replaceAll("”", "\"").replaceAll(":", ":").replaceAll("?", "?").replaceAll(",", ",");return str;}public static void main(String argv[]) {//源文件路径:路径自己改String filePath = "D:\\note\\jvm\\jvm入门.md";//目标文件路径,可以和源文件一致,路径自己改String fileDest = "D:\\workspace\\jvm\\chapter05\\src\\main\\java\\a.md";documentAlter(filePath,fileDest);}
}

程序运行时间:65ms
还是api调用工程师舒服,别人写好的直接拿过来用就行。读写文件比上面两种效率高的多

这里我有个疑问,就是FileUtils.writeStringToFile(),
IOUtils.toString()使用完后会不会帮我关闭流。源码我没看到关闭流,或者是try with resource会帮我把流全关掉?这里我不太懂。

两个常用方法

IOUtils.toString(@NotNull java.io.InputStream input,
@Nullable String charsetName)

官方文档描述
Gets the contents of a Reader as a String.
This method buffers the input internally, so there is no need to use a BufferedReader
以字符串形式获取读取器的内容。
此方法在内部缓冲输入,因此不需要使用BufferedReader

参数:input 输入流
charsetName 字符集一般填UTF-8
@Nullable 表示非空的意思 ,参数不能为空

FileUtils.writeStringToFile(@NotNull java.io.File file,
@Nullable String data,
@Nullable String charsetName)

把字符串写到目标文件中,如果文件不存在会创建。参数:(目的地,字符串数据,编码格式)

这个commons.io工具包给我的感觉就是太好用了
其他的用到再学习吧。

我个人做笔记时喜欢用截图软件把文字截下来,再粘到笔记中,很多时候标点符号就会乱,配合着这个代码可以节约时间。整理笔记的具体逻辑可以自己写~

测试程序执行时间

public void executionTime(){long startTime = System.currentTimeMillis(); //获取开始时间//此处放执行代码,end-start=程序执行时间long endTime = System.currentTimeMillis(); //获取结束时间System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
}

<Java>使用commons.io修改文件内容(中文标点符号改成英文)相关推荐

  1. ubuntu将主文件夹的文件夹中文名称改为英文

    版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Lee_J_R/article/details/54895493 </div>& ...

  2. ubuntu 装机技巧 双系统引导修复boot-repair 换源 github安装 截图 文件夹中文名称改为英文 deb包的安装方法 更改时间

    ubuntu 装机技巧 文章目录 ubuntu 装机技巧 一.换源 +github上网 换源 github 上网 二.ubuntu win双系统引导修复boot-repair 三.ubuntu将主文件 ...

  3. 如何linux中文改为英文,CentOS系统如何将中文语言改成英文

    原标题:CentOS系统如何将中文语言改成英文 CentOS中修改系统默认语言,把原来到中文环境改为英文环境 修改i18n文件 #vi /etc/sysconfig/i18n ------------ ...

  4. 怎么把中文用户名改成英文?

    我们的c盘存放的是我们系统的文件,有些用户没有键盘分盘,软件游戏也在其中,因为名字是中文,需要更改成英文,那么win11怎么把中文用户名改成英文?很多小伙伴都想要了解,下面就来看看具体的操作. 第一步 ...

  5. Cent OS home下中文目录改成英文目录

    如果安装了中文版的Cent OS之后,root目录和home目录下会出现中文的路径名,如"桌面"."文档"."图片"."公共的&q ...

  6. 如何把C盘下用户的中文用户名改成英文用户名

    一:简单介绍 1:很多程序或者服务如下图中路径里出现了汉字,总是会遇到各种莫名其妙的报错. (修改后的效果就是如下图,这是我已经改好的英文名字) 2:我的系统是Windows 10 家庭版. 3:理解 ...

  7. Windows 10 的中文用户名改成英文

    首先如果是使用中文用户名的朋友如果平常办公的话没什么影响,不过如果整一些软件或者什么的话,还是建议改成英文(不然会有很多不必要的麻烦) 1. 首先我们需要开启个用户: 先以管理员模式启动命令提示符(W ...

  8. win10修改用户名(中文用户改为英文名)切换administrators管理员用户

    1.进入administrators管理员账户 1) 以管理员模式打开命令行(如图): win+r 输入cmd.右键单击命令提示符(如图1),选择以管理员形式运行(如图2) 图.1 图.2 2).在打 ...

  9. UBuntu16.04中文语言环境下 把文件夹中文名字改为英文

    使用Ubuntu16.04时候,由于中文环境下,把Home的文件夹名字都默认为中文的, 然而,在使用终端操作的时候,英文更加方便,所以需要改为英文,操作如下: export LANG=en_US xd ...

最新文章

  1. 区块链共识算法:PoS即权益证明 DPoS委托授权的权益证明
  2. 小米手机 DELETE_FAILED_INTERNAL_ERROR Error while Installing APKs
  3. [LeetCode]Array主题系列{35,39,40,48题}
  4. 判断Oracle中某个字段是否含有数字
  5. web.xml里filter-mapping中的dispatcher作用
  6. spring-core
  7. linux adc测试程序,基于Qt4.7的ADC测试程序
  8. (07)VHDL实现闪灯
  9. java mina 大文件传输_mina 传输java对象
  10. HDMI接口 PCB布线指南-4层板为例
  11. linux中批量删除用户,Linux shell批量删除用户
  12. 组建计算机网络的硬件设备,计算机网络的硬件组成中包含了哪些硬件设备
  13. 哪个dns服务器延迟最低,可以立即测出延迟最小的DNS
  14. MySQL 五.索引与算法
  15. Java通过freemaker实现健康报告生成(包含列表、列表合并列)
  16. 一款基于 Spring Boot 的神仙接私活项目,已开源,2022 接私活必备!
  17. 5G通信技术解读:波束成形如何为5G添翼?
  18. 根式进入计算机的方法
  19. lc[栈与队列]---232.用栈实现队列
  20. 《热点:引爆内容营销的6个密码》第一章--书摘

热门文章

  1. BlueTooth: 蓝牙基带
  2. C++笔记005:用面向过程和面向对象方法求解圆形面积
  3. 《Java 核心技术 卷1》 笔记 第11章 异常、日志、断言和调试
  4. 如何制定新年节假日ASO搜索优化策略
  5. SaaSBase:什么是企域数科?
  6. 网络技术 | Cisco Packet Tracer 6.2安装包 安装教程
  7. 浙江计算机专业技术考试大纲,浙江省高校计算机等级考试大纲(三级)
  8. antd表格显示分页怎么取消_新买手机号码打电话显示骚扰推销怎么解除取消?...
  9. 5GNR RIV计算
  10. 英文文本关键词抽取——使用NLTK进行关键词抽取