读取和写入文本文件的工具类

前言

最近做的一个项目需要读取模型输出的Dat的文本文件,涉及到的文件太多,想着封装一个工具类(没有考虑效率,只是能拿来用而已。代码水平很低,大佬有更好的方法请在评论区指正,谢谢)

代码采用了hutool工具包

Tips:调用时传的的行号/列 均为从1开始;

1.读取文本文件工具类

包括:1、指定开始行/结束行读取 2、指定开始行&结束行读取 3、获取指定行数据 

代码如下(示例):

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        行
	 * @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);
	}
}

2.写文本文件工具类

包括 1、修改指定行 2、修改多行 3、修改指定 行 的 列

代码如下(示例):

import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.io.file.FileWriter;
import cn.hutool.core.text.StrSplitter;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

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 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 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);
	}
}

总结

Tips:调用时传的的行号/列 均为从1开始;

作为 Shit Code King,代码写的很菜,大佬们有更好的方法可以在评论区讨论,我会虚心学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值