利用Java输入输出流更改文件中指定的内容
昨天准备发布一个数学公式的博客到wordpress上,但是在Typora中写的数学公式的格式与wordpress中的编辑器所指定的格式不同。本来想着手动改一下算了,但仔细一想这个数学公式博客以后还会更新,所以干脆写一个程序直接转换格式。本来想用python进行转换的但是读取文件时出现了错误,所以想着先用Java处理,以后再试着用python去处理。
转换的目标
Typora中的数学格式:
$$
ext{奇函数:}f(x) = -f(-x)
$$
wordpress中的数学格式:
```mathjax
ext{奇函数:}f(x) = -f(-x)
```
实现思路:
这两者之间主要是头标记和尾标记需要进行处理,中间部分都还是使用Latex进行书写的。因此我们的目标是只需要将头标记$$
转换为 ```mathjax
,尾标记$$
转化为```
就可以了。
接着想怎么用编程实现
- 先要将文件读入到程序中,在这里由于文件内容都是字符所以我使用
Reader
类去处理会比用InputStream
类方便一些 - 然后我想让程序一行一行的去读入,可以不用去使用字符串的截断操作,因此我会使用
BufferedReader
类中的readLine()
方法去一行一行的读入 - 接着我们只要让程序在第一次读入
$$
时转换为```mathjax
,第二次读入时将$$
转化为```
,然后写入到另一个文件中去,这就大功告成了。
代码实现:
import java.io.*;
/**
* @Author HeHao
* @Date 2020/10/21 17:10
* @Version 1.0
*/
public class Transform {
/**
*
* @param sourcePath 读取文件的路径
* @param destinationPath 写入文件的路径
*/
static void readFile(String sourcePath, String destinationPath) {
try {
var bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(sourcePath)));
var bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(destinationPath)));
var line = ""; //每一次读入一行的内容
var first$$ = false;//是不是头标记$$
while ((line = bufferedReader.readLine()) != null) {//如果没有读到文件末尾就一直读取
if (line.startsWith("$$"))
first$$ = !first$$;
if (first$$ && line.startsWith("$$")) {//是头标记$$
var transformLine = "```mathjax
";//进行头标记的转换
bufferedWriter.write(transformLine);//写入到目标文件中
System.out.println(transformLine);
} else if (line.startsWith("$$")) {//是尾标记
bufferedWriter.write("```
");//对尾标记进行转换并且写入
} else {
bufferedWriter.write(line + "
");//既不是头标记也不是尾标记,正常写入
System.out.println(line);
}
}
bufferedReader.close();//关闭读写资源
bufferedWriter.flush();
bufferedWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
var sourcePath = "C:\Users\10365\Desktop\math\公式.md";
var destinationPath = "C:\Users\10365\Desktop\math\公式2.md";
readFile(sourcePath, destinationPath);
}
}