如何在NIO中将字节从ByteBuffer解码为UTF-8符号?

问题描述

我需要使用NIO读取并打印文件中的一些文本。代码可以很好地使用英语,但是对于俄语,我需要以UTF-8解码字节。 我不了解将字节转换为UTF-8符号的顺序。你能帮忙吗?

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.file.*;

public class Practice {
    public static void main(String[] args) {
        try (FileChannel fChan = (FileChannel) Files.newByteChannel(Paths.get("D:/test.txt"))) {

         ByteBuffer byteBuf = ByteBuffer.allocate(16);
         int count;

            do {
                count = fChan.read(byteBuf);
                
                if(count != -1) {
                    byteBuf.rewind();

                    for(int i = 0; i < count; i++) {
                        System.out.print((char) byteBuf.get());
                    }
                }
            } while(count != -1);

         } catch(InvalidpathException e) {
             System.out.println("Path exception " + e);
         } catch(IOException e) {
             System.out.println("IO Exception " + e);
         }
    }
}

解决方法

要从ByteBuffer中读取UTF-8编码的文本,可以将其解码为CharBuffer

CharBuffer charBuffer = StandardCharsets.UTF_8.decode(byteBuffer);

要获得更细粒度的访问,请使用基础的CharsetDecoder

CharsetDecoder charsetDecoder = StandardCharsets.UTF_8.newDecoder();

如果您真的想自己获取原始字节并使用UTF-8对其进行解码,那么您首先需要学习UTF-8的工作原理,因此请在网络上搜索UTF-8并开始阅读,因为问题写了,听起来你还不知道。要为此实际编写代码,您还需要知道如何用Java进行位操作,因此,如果您也不知道该怎么做,请进行另一次Web搜索并开始阅读。如果您不能同时使用这些信息,请写一个新问题,解释您所知道的,以及是什么使您无法将自己的知识应用于问题。