李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
正则表达式--Java IO
Leefs
2019-12-30 AM
2218℃
0条
# 正则表达式--Java IO ### 前言 本批昂讲述《Java编程思想》第13.6.8小节:正则表达式与Java I/O ### 概述 通过正则表达式在一个文件中进行搜索匹配操作: ```java public class JGrep { public static void main(String[] args) { if(args.length <2){ System.out.println("Usage: java JGrep file regex"); System.exit(0); } Pattern p = Pattern.compile(args[1]); int index = 0; Matcher m = p.matcher(" "); for(String line:new TextFile(args[0])){ m.reset(line); while(m.find()){ System.out.println(index++ +":"+m.group()+":"+m.start()); } } } } ``` 通过net.mindview.util.TextFile对象将文件打开,读入所有的行后,并存储在一个ArrayList中。因此,可以用循环来迭代遍历TextFile对象中的所有行。虽然也可以在for循环内部创建新的Matcher对象,但是,在循环外创建一个空的Matcher对象,然后用rest()方法每次为Matcher加载一行输入,这种处理会有一定的性能优化。最后用find()方法搜索结果。 ### 练习 **题目** ```java 将一个源文件夹中所有.doc文件拷贝到另一个目的文件夹中,并将扩展名改为.docx ``` **题目分析** > 1. ”源“和”目的“两个文件夹。 > 2. 判断”源“文件夹是否存在,或者是否为有效路径,不存在报异常。 > 3. 存在,遍历”源“中的所有文件,后缀是.doc的文件名字提取出来放到一个数组或集合中。 > 4. 判断是否有”目的“文件夹,如果没有,创建。有,利用正则表达式将文件后缀改成.docx。 > 5. 定义一个”读取“和”写入“的函数,用来将从”源“中读取的文件内容写入到”目的“文件中。 **代码实现** ```java public class CopyAndChange { // 定义一个复制文件的方法,将FileReader和FileWriter创建的对象传入,进行读写操作 private static void copy(FileReader fr, FileWriter fos) throws IOException { // 定义一个长度为1024的字符数组,这是读写操作时常用的规则 char[] buf = new char[1024]; // 定义一个int类型的len并初始化为0 int len = 0; // 进入while循环,循环的前提是FileReader创建的对象可以读到数据 while ((len = fr.read(buf)) != -1) { // 读到数据之后,FileWriter创建的对象将这些数据写到“数据流”中 fos.write(buf, 0, len); // 刷新,否则文件内容写不进去 fos.flush(); } } public static void main(String[] args) throws IOException { // 用字符串表示doc文件所在的目录和docx文件所在的目录 String from = "d:\\doc"; String to = "d:\\docx"; // 使用File创建的对象关联doc目录和docx目录 File start = new File(from); File end = new File(to); // 使用FileReader和FileWriter来对文件进行读写操作 FileReader fr = null; FileWriter fw = null; // 判断一下,如果doc文件夹没有或者不是一个目录的话,就输出“没有找到指定路径!” if (!start.exists() && !start.isDirectory()) { System.out.println("没有找到指定路径!"); } /* * File对象调用listFiles方法可以返回一个文件数组,里面装满了遍历出来的文件, * 创建FilenameFilter对象可以对该文件数组中的文件名进行判断,符合一定条件的 * 文件才会被装入,这里指定的条件是后缀名是“.java”的文件才会被装入 * */ File[] files = start.listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".doc"); } }); // 判断txt文件夹是否存在,如果不存在,就创建一个 if (!end.exists()) { end.mkdir(); } // 使用一个高级for循环,遍历doc文件 for (File file : files) { /* * 注意:这里必须使用replaceAll方法利用正则表达式将doc文件的后缀名更改, * 不能简单使用replace方法替换里面的“.docx”字符串,因为如果一个文件的名字 * 是“hello.doc.doc”的话,如果使用replace(".doc",".docx")的话,文件名 * 就会更改成“hello.docx.docx”,这样相当不严谨,所以使用replaceAll()方法 * 替换文件后缀名 * */ String endName = file.getName().replaceAll("\\.doc$", ".docx"); // 利用FileReader创建的对象读取文件doc文件内容 fr = new FileReader(file); // 利用FileWriter创建的对象写入到d:\\doc文件夹中,并且重新定义后缀名 fw = new FileWriter(new File(end, endName)); // 调用copy方法,该方法是将读取doc文件和写入docx文件进行了封装 copy(fr, fw); // 每循环一次就输出一下doc文件已经被转换成了docx文件 System.out.println("文件:" + file.getName() + "..已经复制成为:" + endName); // 关流操作 fr.close(); fw.close(); } // 提醒用户,所有文件已经复制完毕 System.out.println("\r\n" + "所有doc文件已经被复制成为docx文件!"); } } ``` *附:[参考文章链接](https://blog.csdn.net/nerv2013/article/details/19452555)*
标签:
Java
,
Java编程思想
,
字符串
,
正则表达式
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/345.html
上一篇
正则表达式--替换操作和Rest()方法
下一篇
Linux服务器搭建JavaWEB项目(一)
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Quartz
微服务
Netty
NIO
数据结构
MyBatis-Plus
nginx
Beego
Git
二叉树
Livy
Stream流
数学
稀疏数组
SpringCloud
FileBeat
Java
Http
Azkaban
Scala
Kafka
Spark Core
序列化和反序列化
国产数据库改造
Filter
Redis
前端
DataX
FastDFS
Sentinel
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭