将大长度的byte[]数组按照数组中值为指定的两个数值分割为集合

yueguangkai001 2010-04-20 07:18:00
如题

将一个长度为很大的byte[]数组进行分割

byte数组中有两个连接的数值譬如说是 47 110 这两个值在一起就进行分割,分割为集合

最好就是要求效率高一点,由于byte数组中的数据量比较大,没有效率的话会很慢

请高手指点指点
...全文
1587 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
justlearn 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 araychou 的回复:]
引用 23 楼 justlearn 的回复:
默认字符集 ISO-8859-1


这个难说,不同操作系统的默认设置,同种系统不同的参数设置,这个默认字符集是不一样的。

而且,我在运行tomcat的时候,通常会加一个 -Dfile.encoding=GBK 或者 -Dfile.encoding=UTF-8
[/Quote]
getBytes()和new String(byte[] b)在同一段代码里,至少保证了在两次转换中不会有问题,同样使用同一平台的字符集,当然,如果都设定下也是不错滴
ArayChou 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 justlearn 的回复:]
默认字符集 ISO-8859-1
[/Quote]

这个难说,不同操作系统的默认设置,同种系统不同的参数设置,这个默认字符集是不一样的。

而且,我在运行tomcat的时候,通常会加一个 -Dfile.encoding=GBK 或者 -Dfile.encoding=UTF-8
ArayChou 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 bawgiitx 的回复:]

将大长度的byte[]数组
byte[]有多少GB,CPU多核的?
[/Quote]

根据虚拟机规范,数组长度理论上最大可以达到Integer.maxValue();
justlearn 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 araychou 的回复:]
引用 16 楼 justlearn 的回复:

Arrays.copy 速度应该是快的,问题是他这里必须要先寻找需要copy的开始点和结束点,循环数组太慢

其次,String的getBytes()方法内部本身就是使用的Arrays.copy,可以看源码


用String来处理要考虑以下问题:

byte[]转换为String的时候,有一个charset的问题。如果你没有指定合……
[/Quote]
默认字符集 ISO-8859-1
bawgiitx 2010-04-21
  • 打赏
  • 举报
回复
将大长度的byte[]数组
byte[]有多少GB,CPU多核的?
ArayChou 2010-04-21
  • 打赏
  • 举报
回复
我还想到一个问题,如果楼主的byte[]相当的,速度又要求相当快的话。还可以将byte[]分为若干部分,开若干线程来分别处理,然后在汇总结果。

现在的机器一般是多核cpu,服务器更是多cpu,这样处理,效率可能会快n倍(n=cpu核心数)。
ArayChou 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 justlearn 的回复:]

Arrays.copy 速度应该是快的,问题是他这里必须要先寻找需要copy的开始点和结束点,循环数组太慢

其次,String的getBytes()方法内部本身就是使用的Arrays.copy,可以看源码
[/Quote]

用String来处理要考虑以下问题:

byte[]转换为String的时候,有一个charset的问题。如果你没有指定合适的字符集,肯定会出问题的。
(我没有去研究实际上有没有合适的字符集,我想应该有)。

其次,在byte[]转换为String的时候,实际上多了一个内存分配操作。楼主说这个byte[]是大长度的,不知道长度有多“大”,这个操作应该会耗点时间。不如直接访问原始byte[]数组比较来的快。




btw:直接访问byte[]查找特定值,可以参考String.indexOf的源码来些
ArayChou 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 hardycheng 的回复:]

有个 Arrays。copy
[/Quote]

我是来较真的,真的没有Arrays.copy,只有这个:
java.util.Arrays.copyOf(char[], int)

不过,他底层也是调用:
java.lang.System.arraycopy(Object, int, Object, int, int)
yueguangkai001 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 justlearn 的回复:]
Arrays.copy 速度应该是快的,问题是他这里必须要先寻找需要copy的开始点和结束点,循环数组太慢

其次,String的getBytes()方法内部本身就是使用的Arrays.copy,可以看源码
[/Quote]
我将数据流的数据打开看了下,没有超过FF的,就是说用String的方式不会产生丢失的现象

Arrays.copy我很想见识下,但是由于JDK1.5没看到,我也不做考虑,非常感谢各位的帮助,

但是遗憾的是,我的想法不对,将那些压缩数据放入文件流中,在转化为压缩数据,再来解压不行,解压还依赖与其他的参数,还是不能够将那些压缩数据进行转化为图片,最后进行播放
解压依赖的参数太郁闷了,线程太多,代码太难,郁闷,二次开发真不容易
yueguangkai001 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 justlearn 的回复:]
Arrays.copy 速度应该是快的,问题是他这里必须要先寻找需要copy的开始点和结束点,循环数组太慢

其次,String的getBytes()方法内部本身就是使用的Arrays.copy,可以看源码
[/Quote]
我将数据流的数据打开看了下,没有超过FF的,就是说用String的方式不会产生丢失的现象

Arrays.copy我很想见识下,但是由于JDK1.5没看到,我也不做考虑,非常感谢各位的帮助,

但是遗憾的是,我的想法不对,将那些压缩数据放入文件流中,在转化为压缩数据,再来解压不行,解压还依赖与其他的参数,还是不能够将那些压缩数据进行转化为图片,最后进行播放
解压依赖的参数太郁闷了,线程太多,代码太难,郁闷,二次开发真不容易
justlearn 2010-04-21
  • 打赏
  • 举报
回复
Arrays.copy 速度应该是快的,问题是他这里必须要先寻找需要copy的开始点和结束点,循环数组太慢

其次,String的getBytes()方法内部本身就是使用的Arrays.copy,可以看源码
hardycheng 2010-04-21
  • 打赏
  • 举报
回复
有个 Arrays。copy
不过对象只能是基本数据类型的数组的copy
而不能是一个对象的数组的copy


如果能用指针肯定很方便。
ArayChou 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yueguangkai001 的回复:]

引用 10 楼 araychou 的回复:


其实,这个东西没有什么好的优化可言,就是要一个字节一个字节的比较,然后再调用二楼的Array.copy()就可以了

[/Quote]

对不起,我没有去考证,没有Array.copy()这个方法,整整的方法是这个:
java.lang.System.arraycopy(Object, int, Object, int, int)

这是一个native的方法,很有可能直接使用汇编语言编写的,内存拷贝用它肯定没错。

说道native的方法,如果将这个功能用C来实现,写一个native的方法,应该可以将速度增加,不过我没有写native的经验,不知道具体能提高多少
justlearn 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yueguangkai001 的回复:]
引用 10 楼 araychou 的回复:
楼上转换为String在处理有可能有问题。楼主并没有说byte数组里存的东西可以正确转换为String. 如果转换不了,上面的代码就搞不定了。

其实,这个东西没有什么好的优化可言,就是要一个字节一个字节的比较,然后再调用二楼的Array.copy()就可以了


说的有理,我再想其他办法考虑下

二楼跟我所传的参数不对,更郁闷的是JDK……
[/Quote]
这个不用担心的,byte取值范围是-128~+127
总共256个,你可以循环打印看下,就是基础字符集。
所以转成String不存在问题,你回转回去也不会有问题。
yueguangkai001 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 araychou 的回复:]
楼上转换为String在处理有可能有问题。楼主并没有说byte数组里存的东西可以正确转换为String. 如果转换不了,上面的代码就搞不定了。

其实,这个东西没有什么好的优化可言,就是要一个字节一个字节的比较,然后再调用二楼的Array.copy()就可以了
[/Quote]

说的有理,我再想其他办法考虑下

二楼跟我所传的参数不对,更郁闷的是JDK1.5没有这样的特性

[Quote=引用 11 楼 justlearn 的回复:]
byte数组的东西怎么可能不能转化成String,你得明白byte里的东西是什么
[/Quote]

byte数组中的东西也不是很清楚,只知道是数据流,最后通过这些数据流转化为图片
justlearn 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 araychou 的回复:]
楼上转换为String在处理有可能有问题。楼主并没有说byte数组里存的东西可以正确转换为String. 如果转换不了,上面的代码就搞不定了。

其实,这个东西没有什么好的优化可言,就是要一个字节一个字节的比较,然后再调用二楼的Array.copy()就可以了
[/Quote]
byte数组的东西怎么可能不能转化成String,你得明白byte里的东西是什么
ArayChou 2010-04-21
  • 打赏
  • 举报
回复
楼上转换为String在处理有可能有问题。楼主并没有说byte数组里存的东西可以正确转换为String. 如果转换不了,上面的代码就搞不定了。

其实,这个东西没有什么好的优化可言,就是要一个字节一个字节的比较,然后再调用二楼的Array.copy()就可以了
justlearn 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yueguangkai001 的回复:]
效率还不错,转化3.38MB的数据流只需要500多ms

要指出justlearn的一个错误都就是
String cut = string.substring(iStart,index+1);截取时不需要index+1,

String cut = string.substring(iStart,index);就可以了
[/Quote]
哈,代码我直接写的,没测试过,只是给你个方案,呵呵
yueguangkai001 2010-04-21
  • 打赏
  • 举报
回复
效率还不错,转化3.38MB的数据流只需要500多ms

要指出justlearn的一个错误都就是
String cut = string.substring(iStart,index+1);截取时不需要index+1,

String cut = string.substring(iStart,index);就可以了
yueguangkai001 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 araychou 的回复:]
如果byte[]是图片数据,我想数据中本生就含有大量的分割符号(字符‘/n’)。

你需要换个思路设计程序。考虑把程序设计成这样:

设计个一个“packet”, 前4个字节为一个int数,存放byte[]的长度。 后面就全是byte[]的内容。

你现读取4个字节,得到长度length。然后向后读取length个字节,这些就是你要的图片内容。

重复上面的,就得到所有的图片了。
……
[/Quote]
高见,我会按照你的方式去尝试的,非常感谢你对此问题的关注,我开了一个线程大量的写入文件,感觉程序吃不消了,郁闷
如果此问题未解决我将再开贴子,希望你能够再次关注
加载更多回复(13)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧