0

在我的代码中,我通过 Internet 发送一个编码为字节数组的 txt 文件,然后将消息转换回另一端并显示它。问题是当我尝试显示它时,它总是显示为“[B@1ef9f1d”或“[B@1764be1”等。

这是接收数据的内容

private void parsePacket(byte[] data, InetAddress address, int port) {
    String datasent[] = (new String(data).trim()).split(",");
    String type = datasent[0];
    String message = datasent[1];
    switch(type){//Data we are receiving from client, type is 5 char
    default:
        System.out.println(type);
        System.out.println(message);
    case "invalid":
        println("Invalid packet", new Color(255, 155, 155));
        break;
    case "login":
        addConnection(message, address, port);
        break;
    case "SendLog":
        printLog(message);
        break;
    }
}
private void printLog(String message) {
    int charperline = 10;
    String line ="";
    for (int i = 0; i < message.length() / charperline; i++){
        for (int j = 0; j < charperline; j++){
        line += message.charAt(i + j);
        }
        println("LOG: " + line);
        line = "";
    }

}

这就是发送它的原因:

public void sendLog(){
    System.out.println("sendlog()");
    InputStream is = getClass().getResourceAsStream("/LOG.txt");
    try
    {
        byte[] text = new byte[10000];
        is.read(text);
            sendData(("SendLog," + text).getBytes());
        //is.close();
        new File("/LOG.txt").delete();
    } catch (IOException e) {
        e.printStackTrace();
    } 
}
public void sendData(byte[] data){
    DatagramPacket packet = new DatagramPacket(data, data.length, ipAddress, 1332);
    try {
        socket.send(packet);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (NullPointerException e){
        e.printStackTrace();
    }
}
4

1 回答 1

3

你所看到的

[B@1ef9f1d

toString()是所有类从该类继承的方法的结果Object,因为 Java 中的所有类都扩展了Object. 这被实现为

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

在这种情况下,getClass().getName()将返回[B,因为它是一个字节数组。

这是因为 Java 中的数组对象没有自定义toString()方法,它们继承了Object's.

如果要打印数组的内容,请尝试

Arrays.toString(yourByteArray);

对于自定义类,您应该始终实现(覆盖)您自己的自定义toString()方法。它对记录很有用。请注意,与引用类型一起使用时,字符串连接会toString()隐式使用该方法将您的对象转换为字符串表示形式。

于 2013-09-08T03:33:41.237 回答