В результате узнал про CodePoint и получилось вот что:
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) {
Path path = Paths.get("src/test");
assert Files.exists(path) : "Файл не найден";
try (BufferedReader bufferedReader = Files.newBufferedReader(path)) {
int ch;
char surrogate = 0;
while ((ch = bufferedReader.read()) != -1) {
if (surrogate != 0) {
ch = Character.toCodePoint(surrogate, (char) ch);
surrogate = 0;
} else if (Character.isHighSurrogate((char) ch)) {
surrogate = (char) ch;
continue;
}
// в результате в ch имеем CodePoint
// можем работать как с обычным символом
System.out.println(Character.toChars(ch));
}
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
}
}
Вдруг кому пригодится.
ps:
в src/test лежит"幸福幸福幸福幸福一个梦想一个梦想Ðtestтест123456"