我有一个以下格式的文件,记录由换行符分隔,但有些记录中有换行符,如下所示。我需要获取每条记录并单独处理它们。该文件的大小可能只有几个Mb。
<?aaaaa>
<?bbbb
bb>
<?cccccc>
我有代码:
FileInputStream fs = new FileInputStream(FILE_PATH_NAME);
Scanner scanner = new Scanner(fs);
scanner.useDelimiter(Pattern.compile("<\\?"));
if (scanner.hasNext()) {
String line = scanner.next();
System.out.println(line);
}
scanner.close();
但是我得到的结果是开头的&lt; \?删除:
aaaaa>
bbbb
bb>
cccccc>
我知道Scanner会消耗任何与分隔符模式匹配的输入。我能想到的就是将分隔符模式添加回每个记录中。(/ p>)
有没有办法不删除分隔符模式?
答案 0 :(得分:5)
仅在前面有">"
字符时打破换行符:
scanner.useDelimiter("(?<=>)\\R"); // Note you can pass a string directly
\R
是一个独立于系统的换行符
(?<=>)
是背后的,断言(不消费)前一个字符是>
此外它很酷,因为<=>
看起来像Darth Vader's TIE fighter。
答案 1 :(得分:1)
我假设你想在任何地方忽略换行符'\n'
。
我会阅读whole file into a String
然后remove all of the '\n'
s in the String
。这个问题的代码部分是这样的:
String fileString = new String(Files.readAllBytes(Paths.get(path)), StandardCharsets.UTF_8);
fileString = fileString.replace("\n", "");
Scanner scanner = new Scanner(fileString);
... //your code
您可以随意提出任何其他问题!
答案 2 :(得分:0)
以下是使用StringBuilder
:
public static void main(String[] args) throws FileNotFoundException {
Scanner in = new Scanner(new File("C:\\test.txt"));
StringBuilder builder = new StringBuilder();
String input = null;
while (in.hasNextLine() && null != (input = in.nextLine())) {
for (int x = 0; x < input.length(); x++) {
builder.append(input.charAt(x));
if (input.charAt(x) == '>') {
System.out.println(builder.toString());
builder = new StringBuilder();
}
}
}
in.close();
}
<强>输入:强>
<?aaaaa>
<?bbbb
bb>
<?cccccc>
<强>输出:强>
<?aaaaa>
<?bbbb bb>
<?cccccc>