我有以下结构:
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(CFG_FILE)));
String line;
while ((line = bufferedReader.readLine()) != null) {
if (line.matches(PATTERN)) {
//do something
}}
我正在阅读的文件如下:
test1,\
test2,\
test3,\
#test4,\
#test5,\
test6,\
#test7,\
test8
我在以if
开头的行中有一个断点,但是在调试时单步调试行时,我注意到line
永远不是以{{1}开头的行之一}。那是为什么?
编辑:这里有更多背景信息:
#
文件中的相关行:
private static final String BASIT_PATTERN = "^\\s+basit-.+";
ArrayList<String> featuresConfigEntries = new ArrayList<>();
try {
BufferedReader featuresConfigBufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(FEATURES_CFG)));
String necessaryComponentsFileLine;
while ((necessaryComponentsFileLine = featuresConfigBufferedReader.readLine()) != null) {
if (necessaryComponentsFileLine.matches(BASIT_PATTERN)) {
final String[] splitNecessaryComponentsFileLine = necessaryComponentsFileLine.split(",");
for (String necessaryComponentString : splitNecessaryComponentsFileLine) {
if (necessaryComponentString.matches(BASIT_PATTERN)) {
featuresConfigEntries.add(necessaryComponentString.replaceAll("\\s+", "").trim());
}
}
}
}
} catch (FileNotFoundException e) {
LOGGER.error("File not found: " + FEATURES_CFG, e);
} catch (IOException e) {
LOGGER.error("Failed reading file: " + FEATURES_CFG, e);
}
答案 0 :(得分:2)
它具有非常具体的确定性行为,已经过十多年的测试。
您的输入文件不包含您的想法。
如果您在读取行时&#34;跳过&#34; 行,则行没有相应的EOL
标记,并且正在与下一行或上一行连接
在阅读该行之后立即设置一个断点是您应该尝试的第一件事。
隐藏的调试日志记录也会告诉你同样的事情。
while ((necessaryComponentsFileLine = featuresConfigBufferedReader.readLine()) != null) {
// have you even tried to System.out.println(necessaryComponentsFileLine); ?
}
您的模式不正确,与至少1 or more whitespace characters
不开始的任何内容都不匹配。
^在行的开头断言位置
\ s +匹配任何空格字符[\ r \ n \ t \ f]量词:+之间 一次和无限次,尽可能多次回馈 需要[贪心]
basit-匹配字符basit-字面意思(区分大小写)
。+匹配任何字符(换行符除外)量词:+在一个字符之间 无限次,尽可能多次,根据需要回馈 [贪婪]