gpt4 book ai didi

java - 在 Java 中使用 GZIP 和 UDP 处理大量字符串的最快方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:31:23 24 4
gpt4 key购买 nike

我正在实现一个日志系统,它需要使用 GZIP 对日志消息进行编码并通过 UDP 发送它们。

到目前为止我得到的是:

初始化:

DatagramSocket sock = new DatagramSocket(); 
baos = new ByteArrayOutputStream();
printStream = new PrintStream(new GZIPOutputStream(baos));

然后这个 printStream 被传出记录器 - 消息将通过它到达

然后每次消息到达时:

byte[] d = baos.toByteArray();
DatagramPacket dp = new DatagramPacket(d,d.length,host,port);
sock.send(dp);

目前困扰我的是我找不到从 ByteArrayOutputStream 中删除数据的方法(toByteArray() 只需要一个副本)而且我担心每次都重新创建所有三个流对象效率很低。

有什么方法可以从流中删除发送的数据吗?或者我应该完全转向另一个方向?

最佳答案

您必须为每条消息创建一个新流;否则,每次调用 toByteArray() 都会再次发送所有之前的消息。

更好的方法可能是用 GZIPOutputStream 包装 TCP 套接字的 OutputStream:

printStream = new PrintStream(new GZIPOutputStream(sock.getOutputStream()));

另外不要忘记在每条消息后刷新 PrintStream 否则什么都不会发生。

如果速度真的那么重要,您应该考虑使用 DatagramChannel 而不是旧的(慢)steam API。这应该让你开始:

ByteBuffer buffer = ByteBuffer.allocate( 1000 );
ByteBufferOutputStream bufferOutput = new ByteBufferOutputStream( buffer );
GZIPOutputStream output = new GZIPOutputStream( bufferOutput );
OutputStreamWriter writer = new OutputStreamWriter( output, "UTF-8" );
writer.write( "log message\n" );
writer.close();

sock.getChannel().open(); // do this once
sock.getChannel().write( buffer ); // Send compressed data

注意:您可以通过倒带重用 buffer,但所有流必须为每条消息创建一次。

关于java - 在 Java 中使用 GZIP 和 UDP 处理大量字符串的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13477321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com