如何在Java中安全地擦除数组的内容?
我正在尝试从客户端接收数据,然后将其登录到控制台。 我是这样做的:如何在Java中安全地擦除数组的内容?,java,Java,我正在尝试从客户端接收数据,然后将其登录到控制台。 我是这样做的: 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 Datagra
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
时,它实际上会重复上一个,然后用一个新的重新打印
不过我已经知道问题出在哪里了
如果我将数组数据的分配
放在while
循环中,一切正常,我不会再收到上一条消息,只收到当前消息
我真的不想这样做,因为在循环内分配不是一个好主意,所以我需要在新数据到来之前清除数组
循环内未分配的输出为:
Console: past message
Console: (imagine i typed hello) hellomessage
依此类推。在循环外部创建数据包,并从数据包中检索大小数据。(否则,您将打印整个数组,其中可能包含最后收到的消息的尾随文本)
Arrays.fill()
?但我怀疑这会比分配新阵列快得多不确定。。。但你们是否也试着让包成为你们封闭类的一个字段呢;这有帮助吗:?@GhostCat的观点很好,似乎我就是这么做的。然后,我自由地接受了flikes的回答;也许,如果你想对我最初的建议给出的其他答案投赞成票;-)但op问题的真正原因是什么?为什么这能解决问题?它是如何工作的?
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());
...