Как правильно считать файл в кодировке UTF-8?
Не надо ничего декодировать, просто укажите кодировку файла при открытииtry (BufferedReader in = new BufferedReader(
       new InputStreamReader(
         new FileInputStream(file), "UTF8"))) {
    // Делайте с входным потоком всё, что вам нужно
}
В результате узнал про 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"