Java辐射读数代码优化:如何用substring截取省略输出内容
解决Java辐射读数输出内容截断问题
我看了你的代码,核心问题是你尝试的字符串截断逻辑没有正确集成到输出流程里,还有几个小细节(比如未定义的变量、语法错误)需要调整。下面是修复后的完整代码,以及关键修改点的说明:
关键问题分析
- 你注释掉的
substring代码没有放到正确的输出位置——应该在最后筛选符合条件的行时使用,而不是单独注释起来。 - 代码里的
dataList变量未定义,这会导致编译错误,我假设你是想匹配包含逗号的有效数据行,所以补充了对应的正则表达式。 - 存在语法错误:
System.outprintln应该是System.out.println。
修改后的完整代码
import java.util.*; import java.io.*; public class counterRadiation { private static String infile = "4_22_18.txt"; private static String outfile = "4_22_18_stripped.txt"; private static Scanner reader; // 定义匹配有效数据行的正则(假设每行包含逗号,可根据实际格式调整) private static final String dataList = ".*,.*"; public static void main(String[] args) throws Exception { try { Scanner play = new Scanner(new File(infile)); Writer writer = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(outfile), "utf-8")); String lineSeparator = System.getProperty("line.separator"); play.useDelimiter(lineSeparator); while (play.hasNext()) { String line = play.next(); // 匹配有效行后写入文件 if (line.matches(dataList)) { writer.write(line + lineSeparator); } } writer.close(); play.close(); try { reader = new Scanner(new File(infile)); ArrayList<String> list = new ArrayList<>(); while (reader.hasNextLine()) { list.add(reader.nextLine()); } // 提取辐射计数值,添加数组越界防护 int[] radiCount = new int[list.size()]; for (int i = 0; i < list.size(); i++) { String[] temp = list.get(i).split(","); if (temp.length >= 3) { radiCount[i] = Integer.parseInt(temp[2]); } else { radiCount[i] = 0; // 无效行设为0,可根据需求调整 } } // 找出最大计数值 int maxCount = 0; for (int count : radiCount) { if (count > maxCount) { maxCount = count; } } // 输出最大计数上下5范围内的数据,并截断每行前16个字符 for (int i = 0; i < list.size(); i++) { if (radiCount[i] >= maxCount - 4 && radiCount[i] <= maxCount + 4) { // 用Math.min避免行长度不足16时抛出索引越界异常 String truncatedLine = list.get(i).substring(0, Math.min(16, list.get(i).length())); System.out.println(truncatedLine + " " + radiCount[i]); } } } catch (FileNotFoundException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } }
重点修改说明
- 字符串截断逻辑:在最后输出符合条件的行时,使用
substring(0, Math.min(16, list.get(i).length()))实现截断——添加Math.min是为了避免当行长度不足16时抛出索引越界异常。 - 修复未定义变量:添加了
dataList的正则定义,匹配包含逗号的行(如果你的数据行格式不同,可以修改这个正则)。 - 数组越界防护:在提取计数值时,判断数组长度是否足够,避免因无效行导致的
ArrayIndexOutOfBoundsException。 - 语法错误修复:修正了
System.outprintln的拼写错误。
这样修改后,就能实现你想要的效果:筛选出最大计数上下5范围内的数据,并且每行只输出前16个字符,再加上对应的计数值。
内容的提问来源于stack exchange,提问作者Ark1982midis
相关产品推荐
相关产品推荐

