代码之家  ›  专栏  ›  技术社区  ›  feroze

Java-ByteBuffer.remaining()问题

  •  3
  • feroze  · 技术社区  · 16 年前

    因此,我编写了如下代码:

        private static void serialize(ByteBuffer buffer, EmployeeData emp, CharsetEncoder encoder)
    {
        // id
        buffer.putInt(emp.getId());
        
        CharBuffer nameBuffer = CharBuffer.wrap(emp.getFirstName().toCharArray());
        ByteBuffer nbBuffer = null;
        
        // length of first name
        try
        {
            nbBuffer = encoder.encode(nameBuffer);
        } 
        catch(CharacterCodingException e)
        {
            throw new ArithmeticException();
        }
    
        System.out.println(String.format("String [%1$s] #bytes = %2$s", emp.getFirstName(), nbBuffer.limit()));
        buffer.putInt(nbBuffer.limit());
        buffer.put(nbBuffer);
    
        // put lastname
        nameBuffer = CharBuffer.wrap(emp.getLastName().toCharArray());
        nbBuffer = null;
        
        // length of first name
        try
        {
            nbBuffer = encoder.encode(nameBuffer);          
        } 
        catch(CharacterCodingException e)
        {
            throw new ArithmeticException();
        }
    
        System.out.println(String.format("String [%1$s] #bytes = %2$s", emp.getLastName(), nbBuffer.limit()));
        buffer.putInt(nbBuffer.limit());
        buffer.put(nbBuffer);
        
        // salary
        buffer.putInt(emp.getSalary());
    }
    

                Socket client = new Socket("localhost", 8080);
            
            OutputStream oStream = client.getOutputStream();
    
            serialize(buffer, emp, encoder);
            
            buffer.rewind();            
            while(buffer.hasRemaining())
            {
                byte temp = buffer.get();
                ++ written;
            }
            
            buffer.rewind();
            System.out.println("#Bytes in output buffer: " + written + " limit = " + buffer.limit() + " pos = " + buffer.position() + " remaining = " + buffer.remaining());
            
            int remaining = buffer.remaining();
            while(remaining > 0)
            {
                oStream.write(buffer.get());
                -- remaining;
            }
    

    这就是我如何创建缓冲区。。。

            Charset charset = Charset.forName("UTF-8");
        CharsetDecoder decoder = charset.newDecoder();
        CharsetEncoder encoder = charset.newEncoder();
        byte [] underlyingBuffer = new byte[1024];
        ByteBuffer buffer = ByteBuffer.wrap(underlyingBuffer);
        buffer.order(ByteOrder.LITTLE_ENDIAN);
    

    这是我得到的打印语句的输出。。。

    字符串[John]#字节=4字符串[Smith]#字节=5

    #输出缓冲区中的字节数:1024限制=1024位置=0剩余=1024

    谢谢

    1 回复  |  直到 5 年前
        1
  •  13
  •   kervin    10 年前

    将字节放入缓冲区后,应该 flip 信息技术你可以这样做,而不是第一次打电话给 rewind 相反

    A. java.nio.Buffer 区别于 capacity limit . 如果不翻转它,则限制和容量与初始化它的数组的长度相同。

    ByteBuffer#remaining 查看位置和极限之间的差值。