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

时间:2025-02-14 22:12:37

前言

最近做的一个项目需要读取模型输出的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,代码写的很菜,大佬们有更好的方法可以在评论区讨论,我会虚心学习。