如何在Java中打印String而不是地址?

Zev*_*eso 0 java string object-address

我的输出是"[B @ b42cbf"没有错误.

它应该是一个表示"服务器检查"的字符串.

如何修复我的代码以输出字符串而不是地址?

我打印对象的代码已经多次更改,但现在如下所示.

System.out.println(packet.getMessage().toString());
Run Code Online (Sandbox Code Playgroud)

我的包类如下.

import java.io.Serializable;

public class Packet implements Serializable {

    final public short MESSAGE = 0;
    final public short COMMAND = 1;

    private String _ip;
    private short _type;
    private String _source;
    private String _destination;
    private byte[] _message;


    public Packet(String ip, short type, String source, String destination,
            byte[] message) {
        this._ip = ip;
        this._type = type;
        this._source = source;
        this._destination = destination;
        this._message = message;
    }

    public String getIP() {
        return this._ip;
    }

    public Short getType() {
        return this._type;
    }

    public String getSource() {
        return this._source;
    }

    public String getDestination() {
        return this._destination;
    }

    public byte[] getMessage() {
        return this._message;
    }
}
Run Code Online (Sandbox Code Playgroud)

我通过ObjectOutputStream发送数据包并在ObjectInputStream中接收它.该对象被包含在具有(分组)的分组中.你可以看到它的工作原理如下.

public void sendPacket(Packet packet) throws NoConnection {
        if (this._isConnected) {
            try {
                this._oos.writeObject(packet);
                this._oos.flush();  // Makes packet send
            } catch (Exception e) {
                e.printStackTrace();
                this._isConnected = false;
                throw new NoConnection("No notification of disconnection...");
            }
        } else {
            throw new NoConnection("No connection...");
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是听众.

@Override
    public void run() {
        try {
            this._ois = new ObjectInputStream(this._socket.getInputStream());
            Packet packet = (Packet) this._ois.readObject();
            this._listener.addPacket(packet);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Thi*_*ilo 8

[B@b42cbf 是打印字节数组时得到的,即二进制数据.

要从中获取String,您需要知道编码,然后您可以执行以下操作:

String messageStr = new String(packet.getMessage(), "UTF-8");
Run Code Online (Sandbox Code Playgroud)

当然,只有当数据实际上是可打印数据时才有效.