1. 需求分析
前一段时间接到一个需求,传入一个txt文件,需要解析文件中的内容,读出指定的参数,写入map中。
1.1 首先看一下传入的文件格式
我截取了部分文档,可以看到文档是按行来解析的,这里就可以想到readLine()
方法,再看每行有三个参数,需要把三个参数单独截取出来,赋值给不同的变量。
2.完成需求
2.1首先是读取文档,循环读出每一行
这里用的是BufferedReader()
字符输入流
package com.example.station.service.impl;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderGantry {
private static final Logger logger = LogManager.getLogger(BufferedReaderGantry.class);
public static Map<String,Object> readFile(File filepath) {
FileReader fr = null;//创建FileReader流
BufferedReader br = null;//创建BufferedReader流
try {
fr = new FileReader(filepath);
br = new BufferedReader(fr);
String data = null;
while((data = br.readLine()) != null){
//循环读取每一行
}
2.2第二步就是截取字符串,赋值给不同的变量了
while((data = br.readLine()) != null){
String[] param = data.split("\\s+");
String ID = param[0].trim();
String StationID = param[1].trim();
String LaneType = param[2].trim();
}
2.2.1方法解析:
- trim(): 删除字符串首部和尾部的空格,发生错误返回空字符串("");
- split: 根据内容分割内容;
- \s: \s代表空格,+代表多个空格
- \t:这个虽然在里面没有使用到,但还是要提一下,这个代表table键
2.3最后就是加入map了,直接放上完整代码
3.完整代码
package com.example.station.service.impl;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;//这两个就是log4j的包
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class BufferedReaderGantry {
private static final Logger logger = LogManager.getLogger(BufferedReaderGantry.class);//这个是log4j,用来记录日志,可以不写,要使用的话导入log4j依赖
public static Map<String,Object> readFile(File filepath) {
FileReader fr = null;
BufferedReader br = null;
Map<String,Object> map = null;
try {
map = new HashMap<>();
fr = new FileReader(filepath);
br = new BufferedReader(fr);//文件输入流
String data = null;
//读取每一行
while((data = br.readLine()) != null){
//由于空格数不定,故按多个空格分隔每一行内容,并存入一个String类型数组里
String[] param = data.split("\\s+");
//读取数组,把分割到内容赋值给相应的变量
String ID = param[0].trim();
String StationID = param[1].trim();
String LaneType = param[2].trim();
//放入map中
map.put("ID",ID);
map.put("StationID",StationID);
map.put("LaneType",LaneType);
}
//异常处理
} catch (IOException e) {
logger.error("",e);
} finally {
if (br != null){
try {
br.close();
} catch (IOException e) {
logger.error("门架文件读取失败",e);
}
}
}
return map;
}
//这个是测试类,你可以自己造个文件,把完整文件路径放上去
//上面没写System.out.println(),要打印的话自己写一下sout
/*@Test
public void testFile() throws IOException {
File filepath = new File("/Users/mac/Desktop/Data/Bgantry.txt");
BufferedReaderGantry.readFile(filepath);
}*/
}
4.写在最后
这是debug后看到的解析结果,可以看到没得问题。