前言
最近做的一个项目需要读取模型输出的Dat的文本文件,涉及到的文件太多,想着封装一个工具类(没有考虑效率,只是能拿来用而已。代码水平很低,大佬有更好的方法请在评论区指正,谢谢)
代码采用了hutool工具包
Tips:调用时传的的行号/列 均为从1开始;
1.读取文本文件工具类
包括:1、指定开始行/结束行读取 2、指定开始行&结束行读取 3、获取指定行数据
代码如下(示例):
import ;
import ;
import ;
import ;
import ;
/**
* 读取模型输出
*
* @author sxy
* @date 2022/07/21
*/
public class ModelOutputUtils {
/**
* 指定开头获取数据
* 返回值是数据的字符串列表 需要自行遍历分割
*
* @param file 文件
* @param startLine 开始行 (文档行号 非索引)
* @param encoding 字符编码
* @return {@link List}<{@link String}>
*/
public static List<String> getDataListByStart(File file, Integer startLine, String encoding) {
if (startLine <= 0) {
throw new IndexOutOfBoundsException("开始行号不能小于1");
}
FileReader fileReader = new FileReader(file, encoding);
List<String> data = new ArrayList<>();
(data);
return (startLine - 1, ());
}
/**
* 指定结尾获取数据
*
* @param file 文件
* @param endLine 头结束行(文档行号 非索引)
* @param encoding 编码
* @return {@link List}<{@link String}>
*/
public static List<String> getDataListByEnd(File file, Integer endLine, String encoding) {
if (endLine <= 0) {
throw new RuntimeException("结束行不能小于1");
}
FileReader fileReader = new FileReader(file, encoding);
List<String> data = new ArrayList<>();
(data);
if (endLine > ()) {
throw new IndexOutOfBoundsException("结束行大于当前数据总行数");
}
return (0, endLine);
}
/**
* 获取范围数据
*
* @param file 文件
* @param startLine 开始行(文档行号 非索引)
* @param endLine 结束行(文档行号 非索引)
* @param encoding 编码
* @return {@link List}<{@link String}>
*/
public static List<String> getRangeData(File file, Integer startLine, Integer endLine, String encoding) {
if (startLine > endLine || startLine <= 0) {
throw new RuntimeException("开始行或结束行异常");
}
FileReader fileReader = new FileReader(file, encoding);
List<String> data = new ArrayList<>();
(data);
if (endLine > ()) {
throw new IndexOutOfBoundsException();
}
return (startLine - 1, endLine);
}
/**
* 通过正则分割指定范围的字符串
*
* @param file 文件
* @param startLine 开始行
* @param endLine 结束行
* @param encoding 编码
* @param splitRegExp 分割正则表达式
* @return {@link List}<{@link List}<{@link String}>> list里是list<String>
*/
public static List<List<String>> getSplitRangeData(File file, Integer startLine, Integer endLine, String encoding, String splitRegExp) {
if (startLine > endLine || startLine <= 0) {
throw new RuntimeException("开始行或结束行异常");
}
FileReader fileReader = new FileReader(file, encoding);
List<String> data = new ArrayList<>();
(data);
if (endLine > ()) {
throw new IndexOutOfBoundsException();
}
List<String> list = (startLine - 1, endLine);
List<List<String>> reList = new ArrayList<>();
for (String s : list) {
List<String> split = (s, splitRegExp, 0, true, true);
(split);
}
return reList;
}
/**
* 指定开头获取分割的字符串
*
* @param file 文件
* @param startLine 开始行
* @param encoding 编码
* @param splitRegExp 分割正则
* @return {@link List}<{@link List}<{@link String}>>
*/
public static List<List<String>> getSplitDataByStart(File file, Integer startLine, String encoding, String splitRegExp) {
FileReader fileReader = new FileReader(file, encoding);
List<String> datas = new ArrayList<>();
(datas);
List<String> list = (startLine, ());
List<List<String>> reList = new ArrayList<>();
for (String data : list) {
List<String> split = (data, splitRegExp, 0, true, true);
(split);
}
return reList;
}
/**
* 指定结尾获取分割的字符串
*
* @param file 文件
* @param endLine 结束行
* @param encoding 编码
* @param splitRegExp 分割正则
* @return {@link List}<{@link List}<{@link String}>>
*/
public static List<List<String>> getSplitDataByEnd(File file, Integer endLine, String encoding, String splitRegExp) {
FileReader fileReader = new FileReader(file, encoding);
List<String> data = new ArrayList<>();
(data);
List<String> list = (0, endLine);
List<List<String>> reList = new ArrayList<>();
for (String s : list) {
List<String> split = (s, splitRegExp, 0, true, true);
(split);
}
return reList;
}
/**
* 获取指定行
*
* @param file 文件
* @param line 行
* @param encoding 编码
* @return {@link String}
*/
public static String getSpecifiedLine(File file, Integer line, String encoding) {
FileReader fileReader = new FileReader(file, encoding);
List<String> data = new ArrayList<>();
(data);
if (line <= 0 || line > ()) {
throw new IndexOutOfBoundsException("请指定正确的行号");
}
return (line - 1);
}
/**
* 获取分割指定行
*
* @param file 文件
* @param line 行
* @param encoding 编码
* @param splitRegExp 正则
* @return {@link List}<{@link String}>
*/
public static List<String> getSplitSpecifiedLine(File file, Integer line, String encoding, String splitRegExp) {
FileReader fileReader = new FileReader(file, encoding);
List<String> data = new ArrayList<>();
(data);
if (line <= 0 || line > ()) {
throw new IndexOutOfBoundsException("请指定正确的行号");
}
String s = (line - 1);
return (s, splitRegExp, 0, true, true);
}
}
2.写文本文件工具类
包括 1、修改指定行 2、修改多行 3、修改指定 行 的 列
代码如下(示例):
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
public class ModelWriterUtil {
/**
* 修改指定行
*
* @param file 文件
* @param line 需要修改的行号(文档行号 从1开始)
* @param encoding 编码
* @param modified 修改后内容 (用,,空格或换行符 分隔)
*/
public static void writerSpecifyLine(File file, Integer line, String encoding, String modified) {
FileReader fileReader = new FileReader(file, encoding);
List<String> originalData = new ArrayList<>();
(originalData);
if (line <= 1 || line > ()) {
throw new IndexOutOfBoundsException("指定行号有误");
}
List<String> list = (modified, "[,, \t]", 0, true, true);
StringBuilder sb = new StringBuilder();
for (String s : list) {
(s);
("\t");
}
(line - 1, ());
FileWriter fileWriter = new FileWriter(file, encoding);
(originalData);
("修改的行号{},修改后的内容{}", line, sb);
}
/**
* 修改多行 (可以同时修改多行)
*
* @param file 文件
* @param modified 修改后内容 (Map<String,String> 键:需要修改的行号,值:修改后的数据[用,,空格或换行符 分隔])
* @param encoding 编码
*/
public static void writerMultiLine(File file, String encoding, Map<String, String> modified) {
FileReader fileReader = new FileReader(file, encoding);
List<String> originalData = new ArrayList<>();
(originalData);
Set<String> keys = ();
for (String key : keys) {
String value = (key);
List<String> list = (value, "[,, \t]", 0, true, true);
StringBuilder sb = new StringBuilder();
for (String s : list) {
(s);
("\t");
}
((key) - 1, ());
("修改的行号{},修改后的内容{}", key, sb);
}
FileWriter fileWriter = new FileWriter(file, encoding);
(originalData);
}
/**
* 修改指定行的列 (可以同时修改多行)
*
* @param file 文件
* @param modified List<String> 字符串集合 按照 『行 列 数据』 中间采用空格或逗号分割
*/
public static void writerSpecifyRanks(File file,String encoding ,List<String> modified) {
FileReader fileReader = new FileReader(file, encoding);
List<String> originalData = new ArrayList<>();
(originalData);
for (String s : modified) {
//获取传入的参数 分割
List<String> list = (s, "[,, \t]", 0, true, true);
if (() < 3) {
throw new IndexOutOfBoundsException("传入的数据有误,请输入 行 列 数据 三个参数 中间采用空格或逗号分割");
}
//行
String line = (0);
//列
String row = (1);
//数据
String data = (2);
//获取原始行数据
String originalLineData = ((line) - 1);
//分割原始行数据
List<String> originalLineDataList = (originalLineData, "[,, \t]", 0, true, true);
//修改原始行 对应的列数据
((row) - 1, data);
StringBuilder sb = new StringBuilder();
//重新组合字符串
for (String dat : originalLineDataList) {
(dat);
("\t");
}
((line) - 1, ());
("修改的行:{}列:{},修改后的内容:{}", line, row, sb);
}
FileWriter fileWriter = new FileWriter(file, encoding);
(originalData);
}
}
总结
Tips:调用时传的的行号/列 均为从1开始;
作为 Shit Code King,代码写的很菜,大佬们有更好的方法可以在评论区讨论,我会虚心学习。