Java 如何使用Input/OutputStream读取/写入数据而不创建新对象LibGDX

Java 如何使用Input/OutputStream读取/写入数据而不创建新对象LibGDX,java,sockets,libgdx,Java,Sockets,Libgdx,我正在使用LibGDX,自从我开始使用这个库以来,我一直遵循他们的建议,从未在运行时使用池和成员变量创建新对象以防止触发垃圾收集器。然而,当涉及到网络时,我很难在不创建新数据(输入/输出)流对象的情况下从InputStream读取(以及从OutputStream写入) 我需要一种方法,使这些对象可重用,以防止每次我收到一个球员的移动,例如创建一个新的对象。 或者,我需要一种从输入/输出流中读取int、float和UTF字符串的方法,而无需使用此对象 目前,我的非有效代码如下所示: /** *

我正在使用LibGDX,自从我开始使用这个库以来,我一直遵循他们的建议,从未在运行时使用池和成员变量创建新对象以防止触发垃圾收集器。然而,当涉及到网络时,我很难在不创建新数据(输入/输出)流对象的情况下从InputStream读取(以及从OutputStream写入)

我需要一种方法,使这些对象可重用,以防止每次我收到一个球员的移动,例如创建一个新的对象。 或者,我需要一种从输入/输出流中读取int、float和UTF字符串的方法,而无需使用此对象

目前,我的非有效代码如下所示:

/**
 * Represents a packet sent from client to server
 * Used when a client sends a chat message to the server
 * Created by winter on 25/03/16.
 */
public class PacketInChat extends Packet
{
    private String message;

    public PacketInChat() { }

    public PacketInChat(String message) {
        this.message = message;
    }

    @Override
    public void readFrom(InputStream stream) throws IOException {
        message = new DataInputStream(stream).readUTF(); //problem here
    }

    @Override
    public void writeTo(OutputStream stream) throws IOException {
        new DataOutputStream(stream).writeUTF(message); //problem here
    }

    //getters/setters for fields
}
我还通过读取它的名称来检测它是哪个套接字,所以这里也有问题:

String packetName = new DataInputStream(socket.getInputStream()).readUTF();
Packet packet = Pools.obtain((Class<? extends Packet>)Class.forName("package me.winter.socialplatformer.server.packet." + packetName));
packet.readFrom(socket.getInputStream());
String packetName=new DataInputStream(socket.getInputStream()).readUTF();

Packet Packet=Pools.acquire((Class根据我的评论,只需使用一个
WeakHashMap
,同样地,对于输出流:

public class PacketInChat extends Packet
{
    private Map<InputStream, DataInputStream> map = new WeakHashMap<>();
    private String message;

    public PacketInChat() { }

    public PacketInChat(String message) {
        this.message = message;
    }

    @Override
    public void readFrom(InputStream stream) throws IOException {
        DataInputStream din;
        synchronized (map)
        {
            if ((din = map.get(stream)) == null)
            {
                map.put(din, in = new DataInputStream(stream));
            }
        }
        message = din.readUTF();
    }

}

这样,您就可以为每个输入/输出流对创建其中一个,并将它们保存在某个映射中。

readUTF()
仍然会创建一个新的
字符串
,因此当您知道如何保存流时,问题不会停止,这本身似乎并不太难。@EJP DataIOStream没有方法给它另一个IOStream来处理,所以这就是我问的原因。不过,您提出了一个有趣的问题。我没有说任何关于DataInput/Ou的内容tputStream有这样一个方法。一个简单的
WeakHashMap
就足够了。但是
readUTF()/String
这个问题是无法克服的。zero GC到底有什么吸引力?@EJP出于好奇,我想知道你使用WeakHashMap的诀窍。我希望zero GC能够提高性能并遵循LibGDX的编码原则。但显然,我需要更多地了解GC及其对游戏的影响。@EJP请参阅新编辑
public class PacketInChat
{
    DataInputStream din;
    DataOutputStream dout;

    public PacketInChat(InputStream in, OutputStream out)
    {
        this.din = new DataInputStream(in);
        this.dout = new DataOutputStream(out);
    }

    public String readMessage() throws IOException { return din.readUTF(); }
    public int readInt() throws IOException { return din.readInt(); }
    // etc
    public void writeMessage(String msg) throws IOException
    {
        dout.writeUTF(msg);
    }
    // etc
}