小容量的byteBuffer 讀取大文本


利用死循環和判斷是否 讀到0個字節,便能判斷是否讀取完成,但它存在如下問題,如果輸入是中文的話,可能沒有讀取完中文的全部3個字節,導致亂碼。如果數據足夠隨機,這樣的情況肯定會出現的

@Test 
    public void readStr() {
        SocketChannel client = (SocketChannel) selectionKey.channel();
        client.configureBlocking(false);
        ByteBuffer byteBuffer = ByteBuffer.allocate(10);
        StringBuilder sb=new StringBuilder();
        while (true) {
            byteBuffer.clear();
            int read = client.read(byteBuffer);
            if (read <= 0) {
                System.out.println(client + "=" + sb);
                break;
            }
            byteBuffer.flip();
            String message = new String(byteBuffer.array(), CharsetUtil.UTF_8);
            sb.append(message);
        }
    }
    

 解決如上問題,個人覺得有兩個方案

方案1:

得到要讀取數據的長度,然后指定byteBuffer 的容量,這樣則可以一次性讀取完所有數據

方案2:

定制協議,按協議好的長度讀取定長數據,然后解析,這樣能保證數據不亂


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM