Starting with JDK 9, the Scanner class comes with a method that returns a stream of delimiter-separated tokens, Stream<String> tokens(). If we treat the text to search as the delimiter of Scanner and we count the entries of the Stream returned by tokens(), then we obtain the correct result:
public static long countOccurrences(
Path path, String text, Charset ch) throws IOException {
long count;
try (Scanner scanner = new Scanner(path, ch)
.useDelimiter(Pattern.quote(text))) {
count = scanner.tokens().count() - 1;
}
return count;
}
The constructors for scanner that support an explicit charset were added in JDK 10.