java代码长度不能大于65535字节的解决办法

59 篇文章 2 订阅
45 篇文章 0 订阅

由于java虚拟机的限制,在java中变量、方法的代码长度是不能大于65535字节的,针对此问题我总结了相关的解决办法。

1. 数据库

这是最为传统的,也是大多数人第一想到到的办法了。

2. 文件

这其实是替代数据库的另一种方法了。

3. 类

将复杂的类细化为多个类。

4. 方法

将复杂的方法细化为多个方法。

其实,介绍这四种方案并不是我本篇想要说的重点,而是要从程序性能的角度来诉述。有时一些相对静态的数据,虽然可以保存在数据库或文件里,但数据库和文件都要涉及到连接、io等性能问题,可能有人会说,我可以将静态数据预加载(即只获取一次,然后存入到静态变量里),但是数据量较大的数据都存入静态变量里,带来的就是系统对内存资源的消耗,在我看来同样是有取舍的。

而如果放入到类或方法里,就能很好解决上述问题。java文件之间的调用,速度的瓶颈已经降低到了JVM级别,无论从速度上还是能耗上都会令你满意,从读取速度上,他绝对比读取数据库快很多。从能耗上,我们不必再将大量的数据放到静态变量里了,什么时候用什么时候new即可。

条条大路通罗马,解决问题总是有着很多方法的,因此不要仅仅局限于“常理”,灵活运用技术才是成长的捷径。各位以后不放试试将一些数据以类或方法的形式去存储。

在我即将发布第四版的日期工具类中,就是一个很好的例子。大家可以参考参考,细细品味其中的各种优点(速度、性能、能耗、耦合性等)。

在 Android 中,可以使用 ByteBuffer 类来处理字节数据。假设接收到的数据包格式为:第一个字节表示数据包类型,接着两个字节表示数据的长度,后面是实际的数据内容。 以下是一个处理分包的示例代码: ```java private ByteBuffer mReceiveBuffer = ByteBuffer.allocate(1024); // 接收缓冲区 private boolean mReceivingData = false; // 是否正在接收数据 private byte mCurrentPacketType; // 当前数据包类型 private int mCurrentPacketLength; // 当前数据包长度 /** * 接收数据方法,data 为接收到的字节数组 */ public void receiveData(byte[] data) { mReceiveBuffer.put(data); // 将数据追加到接收缓冲区 mReceiveBuffer.flip(); // 切换为读模式 while (mReceiveBuffer.remaining() > 0) { if (!mReceivingData) { // 如果没有在接收数据,则需要先读取数据包头部 mCurrentPacketType = mReceiveBuffer.get(); // 读取数据包类型 mCurrentPacketLength = mReceiveBuffer.getShort(); // 读取数据包长度 mReceivingData = true; // 标记正在接收数据 } // 如果接收到的数据长度小于当前数据包长度,则需要继续等待接收 if (mReceiveBuffer.remaining() < mCurrentPacketLength) { break; } // 读取数据内容并进行处理 byte[] packetData = new byte[mCurrentPacketLength]; mReceiveBuffer.get(packetData); handlePacket(mCurrentPacketType, packetData); mReceivingData = false; // 标记接收完成 } mReceiveBuffer.compact(); // 切换为写模式并清空已处理的数据 } /** * 处理数据包方法 */ private void handlePacket(byte packetType, byte[] packetData) { // 根据数据包类型进行相应的处理 switch (packetType) { case 1: // 处理类型为 1 的数据包 break; case 2: // 处理类型为 2 的数据包 break; // ... } } ``` 在上述代码中,首先将接收到的数据追加到接收缓冲区中,并切换为读模式。然后通过 while 循环对接收缓冲区中的数据进行分包处理,如果当前没有在接收数据,则先读取数据包头部,包括数据包类型和长度。如果接收到的数据长度小于当前数据包长度,则需要继续等待接收。如果接收到的数据长度大于等于当前数据包长度,则读取数据内容并进行处理,最后将接收缓冲区切换为写模式并清空已处理的数据。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值