简介
本文详细介绍了如何利用基于糊涂工具包(Hutool)的FileWriter和FileReader,实现高效的文本文件处理。包括写入、修改、删除和插入数据等功能,助力你轻松处理文本文件。
写/修改文本文件工具类
包含
- 修改指定行
- 修改多行
- 修改指定行的列
- 在某行插入数据(实际使用再循环中最好倒叙插入,防止索引变更导致插入错误)
- 删除指定行(同上,循环中建议倒叙删除)
import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.io.file.FileWriter;
import cn.hutool.core.text.StrSplitter;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 模型写入
*
* @author sxy
* @date 2022/07/26
*/
@Slf4j
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<>();
fileReader.readLines(originalData);
if (line <= 1 || line > originalData.size()) {
throw new IndexOutOfBoundsException("指定行号有误");
}
List<String> list = StrSplitter.splitByRegex(modified, "[,, \t]", 0, true, true);
StringBuilder sb = new StringBuilder();
for (String s : list) {
sb.append(s);
sb.append("\t");
}
originalData.set(line - 1, sb.toString());
FileWriter fileWriter = new FileWriter(file, encoding);
fileWriter.writeLines(originalData);
log.info("修改的行号{},修改后的内容{}", line, sb);
}
/**
* 修改指定行
*
* @param file 文件
* @param line 需要修改的行号(文档行号 从1开始)
* @param modified 修改后内容 (用,,空格或换行符 分隔)
*/
public static void writerSpecifyLine(File file, Integer line, String modified) {
FileReader fileReader = new FileReader(file, "GBK");
List<String> originalData = new ArrayList<>();
fileReader.readLines(originalData);
if (line <= 1 || line > originalData.size()) {
throw new IndexOutOfBoundsException("指定行号有误");
}
List<String> list = StrSplitter.splitByRegex(modified, "[,, \t]", 0, true, true);
StringBuilder sb = new StringBuilder();
for (String s : list) {
sb.append(s);
sb.append("\t");
}
originalData.set(line - 1, sb.toString());
FileWriter fileWriter = new FileWriter(file, "GBK");
fileWriter.writeLines(originalData);
log.info("修改的行号{},修改后的内容{}", 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<>();
fileReader.readLines(originalData);
Set<String> keys = modified.keySet();
for (String key : keys) {
String value = modified.get(key);
List<String> list = StrSplitter.splitByRegex(value, "[,, \t]", 0, true, true);
StringBuilder sb = new StringBuilder();
for (String s : list) {
sb.append(s);
sb.append("\t");
}
originalData.set(Integer.parseInt(key) - 1, sb.toString());
log.info("修改的行号{},修改后的内容{}", key, sb);
}
FileWriter fileWriter = new FileWriter(file, encoding);
fileWriter.writeLines(originalData);
}
/**
* 修改多行 (可以同时修改多行)
*
* @param file 文件
* @param modified 修改后内容 (Map<String,String> 键:需要修改的行号,值:修改后的数据[用,,空格或换行符 分隔])
*/
public static void writerMultiLine(File file, Map<String, String> modified) {
FileReader fileReader = new FileReader(file, "GBK");
List<String> originalData = new ArrayList<>();
fileReader.readLines(originalData);
Set<String> keys = modified.keySet();
for (String key : keys) {
String value = modified.get(key);
List<String> list = StrSplitter.splitByRegex(value, "[,, \t]", 0, true, true);
StringBuilder sb = new StringBuilder();
for (String s : list) {
sb.append(s);
sb.append("\t");
}
originalData.set(Integer.parseInt(key) - 1, sb.toString());
log.info("修改的行号{},修改后的内容{}", key, sb);
}
FileWriter fileWriter = new FileWriter(file, "GBK");
fileWriter.writeLines(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<>();
fileReader.readLines(originalData);
for (String s : modified) {
//获取传入的参数 分割
List<String> list = StrSplitter.splitByRegex(s, "[,, \t]", 0, true, true);
if (list.size() < 3) {
throw new IndexOutOfBoundsException("传入的数据有误,请输入 行 列 数据 三个参数 中间采用空格或逗号分割");
}
//行
String line = list.get(0);
//列
String row = list.get(1);
//数据
String data = list.get(2);
//获取原始行数据
String originalLineData = originalData.get(Integer.parseInt(line) - 1);
//分割原始行数据
List<String> originalLineDataList = StrSplitter.splitByRegex(originalLineData, "[,, \t]", 0, true, true);
//修改原始行 对应的列数据
originalLineDataList.set(Integer.parseInt(row) - 1, data);
StringBuilder sb = new StringBuilder();
//重新组合字符串
for (String dat : originalLineDataList) {
sb.append(dat);
sb.append("\t");
}
originalData.set(Integer.parseInt(line) - 1, sb.toString());
log.info("修改的行:{}列:{},修改后的内容:{}", line, row, sb);
}
FileWriter fileWriter = new FileWriter(file, encoding);
fileWriter.writeLines(originalData);
}
/**
* 修改指定行的列 (可以同时修改多行)
*
* @param file 文件
* @param modified List<String> 字符串集合 按照 『行 列 数据』 中间采用空格或逗号分割
*/
public static void writerSpecifyRanks(File file, List<String> modified) {
FileReader fileReader = new FileReader(file, "GBK");
List<String> originalData = new ArrayList<>();
fileReader.readLines(originalData);
for (String s : modified) {
//获取传入的参数 分割
List<String> list = StrSplitter.splitByRegex(s, "[,, \t]", 0, true, true);
if (list.size() < 3) {
throw new IndexOutOfBoundsException("传入的数据有误,请输入 行 列 数据 三个参数 中间采用空格或逗号分割");
}
//行
String line = list.get(0);
//列
String row = list.get(1);
//数据
String data = list.get(2);
//获取原始行数据
String originalLineData = originalData.get(Integer.parseInt(line) - 1);
//分割原始行数据
List<String> originalLineDataList = StrSplitter.splitByRegex(originalLineData, "[,, \t]", 0, true, true);
//修改原始行 对应的列数据
originalLineDataList.set(Integer.parseInt(row) - 1, data);
StringBuilder sb = new StringBuilder();
//重新组合字符串
for (String dat : originalLineDataList) {
sb.append(dat);
sb.append("\t");
}
originalData.set(Integer.parseInt(line) - 1, sb.toString());
log.info("修改的行:{}列:{},修改后的内容:{}", line, row, sb);
}
FileWriter fileWriter = new FileWriter(file, "GBK");
fileWriter.writeLines(originalData);
}
/**
* 在某行插入数据
*
* @param file 文件
* @param line 行号
* @param txt 内容
*/
public static void insertByLine(File file, Integer line, String txt) {
FileReader fileReader = new FileReader(file, "GBK");
List<String> originalData = new ArrayList<>();
fileReader.readLines(originalData);
originalData.add(line - 1, txt);
FileWriter fileWriter = new FileWriter(file, "GBK");
List<String> strList = new ArrayList<>();
for (String s : originalData) {
List<String> listStr = StrSplitter.splitByRegex(s, "[,, \t \\s+]", 0, false, false);
StringBuilder sb = new StringBuilder();
for (String str : listStr) {
sb.append(str);
sb.append("\t");
}
strList.add(sb.toString());
}
fileWriter.writeLines(strList);
}
/**
* 删除指定行
*
* @param file 文件
* @param ints 整数
* @return {@link List}<{@link String}>
*/
public static List<String> deleteSpecifiedLines(File file, int... ints) {
FileReader fileReader = new FileReader(file, "GBK");
List<String> data = new ArrayList<>();
List<String> strings = fileReader.readLines(data);
// 将要删除的行索引按照从大到小的顺序排序
Arrays.sort(ints);
for (int i = ints.length - 1; i >= 0; i--) {
int index = ints[i];
if (index >= 0 && index < strings.size()) {
strings.remove(index);
}
}
ModelFileUtil.writeByStart(file, 1, strings);
return strings;
}
}
读文本文件工具类
包含
- 指定开始行获取文本数据
- 指定结尾行获取文本数据
- 获取开始和结束范围文本数据
- 获取文本数据并按照正则分割
- 获取指定行的文本数据
package cn.yrec.clock;
import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.text.StrSplitter;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* 读取模型输出
*
* @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<>();
fileReader.readLines(data);
return data.subList(startLine - 1, data.size());
}
/**
* 指定结尾获取数据
*
* @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<>();
fileReader.readLines(data);
if (endLine > data.size()) {
throw new IndexOutOfBoundsException("结束行大于当前数据总行数");
}
return data.subList(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<>();
fileReader.readLines(data);
if (endLine > data.size()) {
throw new IndexOutOfBoundsException();
}
return data.subList(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<>();
fileReader.readLines(data);
if (endLine > data.size()) {
throw new IndexOutOfBoundsException();
}
List<String> list = data.subList(startLine - 1, endLine);
List<List<String>> reList = new ArrayList<>();
for (String s : list) {
List<String> split = StrSplitter.splitByRegex(s, splitRegExp, 0, true, true);
reList.add(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<>();
fileReader.readLines(datas);
List<String> list = datas.subList(startLine, datas.size());
List<List<String>> reList = new ArrayList<>();
for (String data : list) {
List<String> split = StrSplitter.splitByRegex(data, splitRegExp, 0, true, true);
reList.add(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<>();
fileReader.readLines(data);
List<String> list = data.subList(0, endLine);
List<List<String>> reList = new ArrayList<>();
for (String s : list) {
List<String> split = StrSplitter.splitByRegex(s, splitRegExp, 0, true, true);
reList.add(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<>();
fileReader.readLines(data);
if (line <= 0 || line > data.size()) {
throw new IndexOutOfBoundsException("请指定正确的行号");
}
return data.get(line - 1);
}
/**
* 获取指定行
*
* @param file 文件
* @param line 行
* @return {@link String}
*/
public static String getSpecifiedLine(File file, Integer line) {
FileReader fileReader = new FileReader(file, "GBK");
List<String> data = new ArrayList<>();
fileReader.readLines(data);
if (line <= 0 || line > data.size()) {
throw new IndexOutOfBoundsException("请指定正确的行号");
}
return data.get(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<>();
fileReader.readLines(data);
if (line <= 0 || line > data.size()) {
throw new IndexOutOfBoundsException("请指定正确的行号");
}
String s = data.get(line - 1);
return StrSplitter.splitByRegex(s, splitRegExp, 0, true, true);
}
/**
* 获取分割指定行
*
* @param file 文件
* @param line 行
* @param splitRegExp 正则
* @return {@link List}<{@link String}>
*/
public static List<String> getSplitSpecifiedLine(File file, Integer line, String splitRegExp) {
FileReader fileReader = new FileReader(file, "GBK");
List<String> data = new ArrayList<>();
fileReader.readLines(data);
if (line <= 0 || line > data.size()) {
throw new IndexOutOfBoundsException("请指定正确的行号");
}
String s = data.get(line - 1);
return StrSplitter.splitByRegex(s, splitRegExp, 0, true, true);
}
/**
* 指定开头获取数据
* 返回值是数据的字符串列表 需要自行遍历分割
*
* @param file 文件
* @param startLine 开始行 (文档行号 非索引)
* @return {@link List}<{@link String}>
*/
public static List<String> getDataListByStart(File file, Integer startLine) {
if (startLine <= 0) {
throw new IndexOutOfBoundsException("开始行号不能小于1");
}
FileReader fileReader = new FileReader(file, "GBK");
List<String> data = new ArrayList<>();
fileReader.readLines(data);
return data.subList(startLine - 1, data.size());
}
/**
* 指定结尾获取数据
*
* @param file 文件
* @param endLine 头结束行(文档行号 非索引)
* @return {@link List}<{@link String}>
*/
public static List<String> getDataListByEnd(File file, Integer endLine) {
if (endLine <= 0) {
throw new RuntimeException("结束行不能小于1");
}
FileReader fileReader = new FileReader(file, "GBK");
List<String> data = new ArrayList<>();
fileReader.readLines(data);
if (endLine > data.size()) {
throw new IndexOutOfBoundsException("结束行大于当前数据总行数");
}
return data.subList(0, endLine);
}
/**
* 获取范围数据
*
* @param file 文件
* @param startLine 开始行(文档行号 非索引)
* @param endLine 结束行(文档行号 非索引)
* @return {@link List}<{@link String}>
*/
public static List<String> getRangeData(File file, Integer startLine, Integer endLine) {
if (startLine > endLine || startLine <= 0) {
throw new RuntimeException("开始行或结束行异常");
}
FileReader fileReader = new FileReader(file, "GBK");
List<String> data = new ArrayList<>();
fileReader.readLines(data);
if (endLine > data.size()) {
throw new IndexOutOfBoundsException();
}
return data.subList(startLine - 1, endLine);
}
/**
* 通过正则分割指定范围的字符串
*
* @param file 文件
* @param startLine 开始行
* @param endLine 结束行
* @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 splitRegExp) {
if (startLine > endLine || startLine <= 0) {
throw new RuntimeException("开始行或结束行异常");
}
FileReader fileReader = new FileReader(file, "GBK");
List<String> data = new ArrayList<>();
fileReader.readLines(data);
if (endLine > data.size()) {
throw new IndexOutOfBoundsException();
}
List<String> list = data.subList(startLine - 1, endLine);
List<List<String>> reList = new ArrayList<>();
for (String s : list) {
List<String> split = StrSplitter.splitByRegex(s, splitRegExp, 0, true, true);
reList.add(split);
}
return reList;
}
/**
* 指定开头获取分割的字符串
*
* @param file 文件
* @param startLine 开始行
* @param splitRegExp 分割正则
* @return {@link List}<{@link List}<{@link String}>>
*/
public static List<List<String>> getSplitDataByStart(File file, Integer startLine, String splitRegExp) {
FileReader fileReader = new FileReader(file, "GBK");
List<String> datas = new ArrayList<>();
fileReader.readLines(datas);
List<String> list = datas.subList(startLine, datas.size());
List<List<String>> reList = new ArrayList<>();
for (String data : list) {
List<String> split = StrSplitter.splitByRegex(data, splitRegExp, 0, true, true);
reList.add(split);
}
return reList;
}
/**
* 指定结尾获取分割的字符串
*
* @param file 文件
* @param endLine 结束行
* @param splitRegExp 分割正则
* @return {@link List}<{@link List}<{@link String}>>
*/
public static List<List<String>> getSplitDataByEnd(File file, Integer endLine, String splitRegExp) {
FileReader fileReader = new FileReader(file, "GBK");
List<String> data = new ArrayList<>();
fileReader.readLines(data);
List<String> list = data.subList(0, endLine);
List<List<String>> reList = new ArrayList<>();
for (String s : list) {
List<String> split = StrSplitter.splitByRegex(s, splitRegExp, 0, true, true);
reList.add(split);
}
return reList;
}
/**
* 指定开头字符 从下一行获取分割的字符串
*
* @param file 文件
* @param startLine 开始行
* @param encoding 编码
* @param splitRegExp 分割正则
* @return {@link List}<{@link List}<{@link String}>>
*/
public static List<List<String>> getSplitDataByStartNext(File file, Integer startLine, String encoding, String splitRegExp, String startStr) {
FileReader fileReader = new FileReader(file, encoding);
List<String> datas = new ArrayList<>();
fileReader.readLines(datas);
List<String> list = datas.subList(startLine, datas.size());
List<List<String>> reList = new ArrayList<>();
boolean startReading = false;
for (String data : list) {
if (data.contains(startStr)) {
startReading = true;
continue;
}
if (startReading) {
List<String> split = StrSplitter.splitByRegex(data, splitRegExp, 0, true, true);
reList.add(split);
}
}
return reList;
}
/**
* 指定开头字符 从下一行获取分割的字符串
*
* @param file 文件
* @param startLine 开始行
* @param splitRegExp 分割正则
* @return {@link List}<{@link List}<{@link String}>>
*/
public static List<List<String>> getSplitDataByStartStrNext(File file, Integer startLine, String splitRegExp, String startStr) {
FileReader fileReader = new FileReader(file, "GBK");
List<String> datas = new ArrayList<>();
fileReader.readLines(datas);
List<String> list = datas.subList(startLine, datas.size());
List<List<String>> reList = new ArrayList<>();
boolean startReading = false;
for (String data : list) {
if (data.contains(startStr)) {
startReading = true;
continue;
}
if (startReading) {
List<String> split = StrSplitter.splitByRegex(data, splitRegExp, 0, true, true);
reList.add(split);
}
}
return reList;
}
/**
* 指定开头字符 从当前行获取分割的字符串
*
* @param file 文件
* @param startLine 开始行
* @param encoding 编码
* @param splitRegExp 分割正则
* @param startStr 开始截取行的开头
* @param ignoreNullRow 是否忽略空行
* @return {@link List}<{@link List}<{@link String}>>
*/
public static List<List<String>> getSplitDataByStart(File file, Integer startLine, String encoding, String splitRegExp, String startStr,Boolean ignoreNullRow) {
FileReader fileReader = new FileReader(file, encoding);
List<String> datas = new ArrayList<>();
fileReader.readLines(datas);
List<String> list = datas.subList(startLine, datas.size());
List<List<String>> reList = new ArrayList<>();
boolean foundStartStr = false;
for (String data : list) {
if (!foundStartStr && !data.contains(startStr)) {
continue;
}
foundStartStr = true;
if (ignoreNullRow && data.trim().isEmpty()) {
continue;
}
List<String> split = StrSplitter.splitByRegex(data, splitRegExp, 0, true, true);
reList.add(split);
}
return reList;
}
/**
* 指定开头字符 从当前行获取分割的字符串
*
* @param file 文件
* @param startLine 开始行
* @param splitRegExp 分割正则
* @param startStr 开始截取行的开头
* @param ignoreNullRow 是否忽略空行
* @return {@link List}<{@link List}<{@link String}>>
*/
public static List<List<String>> getSplitDataByStartStr(File file, Integer startLine, String splitRegExp, String startStr,Boolean ignoreNullRow) {
FileReader fileReader = new FileReader(file, "GBK");
List<String> datas = new ArrayList<>();
fileReader.readLines(datas);
List<String> list = datas.subList(startLine, datas.size());
List<List<String>> reList = new ArrayList<>();
boolean foundStartStr = false;
for (String data : list) {
if (!foundStartStr && !data.contains(startStr)) {
continue;
}
foundStartStr = true;
if (ignoreNullRow && data.trim().isEmpty()) {
continue;
}
List<String> split = StrSplitter.splitByRegex(data, splitRegExp, 0, true, true);
reList.add(split);
}
return reList;
}
}
写的烂的一,能用,没优化
THE END
暂无评论内容