Java处理VDA文件时匹配行首关键字后截取指定位置子串的问题
Java VDA格式文件行首匹配+固定位置截取实现方案
你原来的代码是把所有文件内容拼接成了一个完整字符串再截取,没法针对单独行做匹配,修改逻辑如下:
修改后的完整代码
import java.io.File; import java.io.IOException; import java.util.Scanner; public class Main { // 定义要匹配的行首关键字,可按需修改 private static final String TARGET_PREFIX = "55901"; // VDA格式每行固定长度,避免索引越界 private static final int LINE_FIXED_LENGTH = 128; public static void main(String[] args) { File file = new File("C:\\Users\\Mail\\Desktop\\VDA Reader\\VDA.txt"); // 用try-with-resources自动关流,不用手动写close try (Scanner scan = new Scanner(file)) { while (scan.hasNextLine()) { String currentLine = scan.nextLine().trim(); // 空行直接跳过 if (currentLine.isEmpty()) { continue; } // 匹配行首关键字 if (currentLine.startsWith(TARGET_PREFIX)) { // 校验行长度符合要求再截取 if (currentLine.length() >= LINE_FIXED_LENGTH) { // 按你需要的位置截取,示例截取5-12、13-20位置 String part1 = currentLine.substring(5, 12); String part2 = currentLine.substring(13, 20); // 后续可以加更多截取逻辑,也可以把结果存到集合里做后续处理 System.out.println("截取到的第一段内容:" + part1); System.out.println("截取到的第二段内容:" + part2); } else { System.out.println("目标行长度不符合VDA规范,跳过处理"); } // 如果只有一行55901的行,处理完可以直接break跳出循环,不需要再读后面的行 // break; } } } catch (IOException e) { System.out.println("文件读取出错:" + e.getMessage()); } } }
关键改动说明
- 改用逐行处理逻辑,不需要把整个文件内容拼接成一个字符串,内存占用更低,也方便单独处理每一行
- 用
String.startsWith()方法直接做行首关键字匹配,逻辑简单高效 - 增加了空行跳过、行长度校验逻辑,避免运行时抛出空指针、索引越界异常
- 用try-with-resources语法自动管理Scanner流的关闭,不需要手动调用
close()方法,避免资源泄漏 - 你需要新增其他位置的截取逻辑,直接在匹配成功的代码块里加对应的
substring语句即可,注意Java的substring参数是左闭右开,即substring(a,b)取的是下标从a到b-1的字符
内容的提问来源于stack exchange,提问作者Niklas
相关产品推荐
相关产品推荐

