Java BufferedReader跳过不以'#';
我有以下结构:Java BufferedReader跳过不以'#';,java,regex,Java,Regex,我有以下结构: BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(CFG_FILE))); String line; while ((line = bufferedReader.readLine()) != null) { if (line.matches(PATTERN)) {
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
开头的行中有一个断点,但是在调试过程中,我注意到行
决不是以开头的行之一。为什么呢
编辑:以下是更多的上下文:
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);
}
BufferedReader不会任意跳过行:
它具有非常特定的确定性行为,已经测试了十多年
您的输入文件不包含您认为的内容
如果您读取行时,它正在“跳过”行,则这些行没有相应的EOL
标记,并且正在与下一行或上一行连接
一些非常基本的步骤调试将告诉您需要了解的内容。
在读取行之后放置断点是您应该尝试的第一件事
可怕的调试日志也会告诉你同样的事情
while ((necessaryComponentsFileLine = featuresConfigBufferedReader.readLine()) != null) {
// have you even tried to System.out.println(necessaryComponentsFileLine); ?
}
您的正则表达式无论如何都不会匹配任何该数据:
您的模式不正确,它将不匹配任何不以至少1个或多个空白字符开头的字符
^在行首断言位置
\s+匹配任何空白字符[\r\n\t\f]量词:+介于
一次,无限次,尽可能多地回馈
需要[贪婪]
basit-匹配字符basit-字面意思(区分大小写)
.+匹配任何字符(除换行符外)限定符:+1
无限的时间,尽可能多的时间,根据需要回馈
[贪婪的]
这不应该发生……每一行都应该被读取……我非常怀疑这与BufferedReader
有关。请发布一个简短但完整的程序来演示这个问题。(我怀疑这是你的模式错误和调试器中的错误混合造成的。)如果没有看到你试图匹配的模式,这绝对是无用的,完成的前提是不满足我添加了更多的代码。我的断点在if所在的行中。这意味着,每一行不以#开头都返回一个空字符串,对吗?为什么?这个模式不相关,因为这个问题以前似乎发生过,但我要补充一下。谢谢!我修复了模式,但这并不能解决我的问题,因为某些行甚至无法到达模式。。。
while ((necessaryComponentsFileLine = featuresConfigBufferedReader.readLine()) != null) {
// have you even tried to System.out.println(necessaryComponentsFileLine); ?
}