如何在Java中安全地清空数组内容?

5
我正试图从客户端接收数据并将其记录到控制台中。 这是我如何做到的:
private final int MAX_PACKET_SIZE = 1024;
private byte[] data = new byte[MAX_PACKET_SIZE];

private void receive() {
    new Thread(() -> {
        while (running) {
            DatagramPacket packet = new DatagramPacket(data, data.length);
            try {
                socket.receive(packet);
                sPort = packet.getPort();
                ip = packet.getAddress();
                address = ip.toString();
            } catch (Exception e) {
                e.printStackTrace();
            }
            String messageToPrint = new String(packet.getData());
            System.out.println(messageToPrint.trim() + " " + address + " | " + sPort);
        }
    }).start();
}

当涉及打印我的`messageToPrint`时,它实际上会重复上一个消息,并重新打印新的消息。
不过我已经找出了问题所在。
如果把数组`data`的分配放到`while`循环内部,一切都能正常工作,我不会再次收到之前的消息,只有当前的消息。
但我不想这么做,因为循环内的分配不是一个好主意,所以我需要在新数据到来之前清除我的数组。
不在循环内部分配的输出内容如下:
Console: past message

Console: (imagine i typed hello) hellomessage

以此类推。


2
Arrays.fill()?但我怀疑这不会比分配一个新数组更快。 - user330315
2
不确定...但是你是否也尝试将packet作为你所在类的一个字段? - GhostCat
或者,这个链接有帮助吗:https://dev59.com/dnTYa4cB1Zd3GeqPskAM? - GhostCat
@GhostCat 说得好,似乎我就是这么做的。 - user6866343
1
随意接受flikes的答案;如果你想为我的其他回答点赞,以表感谢我提出了最初的建议,也可以这样做。;-) - GhostCat
@Zal 非常感谢你! - GhostCat
1个回答

2
在循环外创建数据包,并从数据包中获取大小数据。(否则将打印整个数组,其中可能包含上一个消息的尾随文本)
final DatagramPacket packet = new DatagramPacket(data, data.length);
while (running) {
    try {
        socket.receive(packet);
        ...
    final String messageToPrint = new String(
            packet.getData(), 
            packet.getOffset(), 
            packet.getLength());
    ...

但是,OP遇到问题的实际原因是什么?为什么这样解决可以解决问题?它是如何工作的? - dabadaba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接