如何从文件行中提取指定值?Java代码优化求助
解决方案:提取指定行中的特定字段
从你的需求和示例数据来看,当前代码会输出包含目标符号的整行,而你需要提取行内的i4244190字段。示例行是用**分号;**分隔的结构化数据,我们可以通过字符串分割的方式精准提取目标内容,以下是两种可行方案:
方案1:按固定索引提取(适合数据格式固定的场景)
如果每行的字段顺序固定,iXXXXXXX始终是第2个字段(分割后的数组索引为1),可直接通过索引提取:
修改原代码中的forEach逻辑:
Files.lines(pathFileToRead) .filter(str -> str.contains(symbol)) .forEach(line -> { // 按分号分割行数据,自动处理末尾分号产生的空元素 String[] fields = line.split(";"); if (fields.length > 1) { // 避免数组越界异常 System.out.println(fields[1]); } });
方案2:按字段前缀提取(适合字段顺序可能变化的场景)
如果字段顺序不固定,但目标字段始终以i开头,可遍历分割后的字段匹配前缀:
Files.lines(pathFileToRead) .filter(str -> str.contains(symbol)) .forEach(line -> { String[] fields = line.split(";"); for (String field : fields) { if (field.startsWith("i")) { System.out.println(field); break; // 找到目标字段后退出循环 } } });
额外优化建议
- 统一输入处理:原代码同时使用
Scanner和BufferedReader,可统一用Scanner简化:
Scanner scanner = new Scanner(System.in); System.out.println("Enter date YYYY-MM-DD: "); String date = scanner.nextLine(); System.out.println("Enter symbol: "); String symbol = scanner.nextLine(); // 后续统一使用scanner,最后关闭 scanner.close();
- 自动资源管理:使用try-with-resources语法避免手动关闭流时的异常:
try (Stream<String> lines = Files.lines(pathFileToRead)) { // 业务逻辑代码 } catch (IOException e) { System.err.println("文件读取失败: " + e.getMessage()); e.printStackTrace(); }
完整修改后的代码(结合方案1与资源自动管理)
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Scanner; import java.util.stream.Stream; public class FileReadContent { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Enter date YYYY-MM-DD: "); String date = scanner.nextLine(); Path pathFileToRead = Paths.get("c:\\tmp\\data-full-" + date + ".tip"); System.out.println("Enter symbol: "); String symbol = scanner.nextLine(); try (Stream<String> lines = Files.lines(pathFileToRead)) { lines.filter(str -> str.contains(symbol)) .forEach(line -> { String[] fields = line.split(";"); if (fields.length > 1) { System.out.println(fields[1]); } }); } catch (IOException e) { System.err.println("读取文件时出错: " + e.getMessage()); e.printStackTrace(); } scanner.close(); } }
内容的提问来源于stack exchange,提问作者Mika
相关产品推荐
相关产品推荐

