当前位置: 首页 > news >正文

苏州企业网站制作开发苏州电子商务网站建设

苏州企业网站制作开发,苏州电子商务网站建设,做网站市场价格多少钱,8x8x域名解析ip地址查询 1080p由于某种原因#xff0c;我需要非常大的#xff0c;甚至可能是无限的InputStream #xff0c;它会反复地反复返回相同的byte[] 。 这样#xff0c;我可以通过重复小样本来产生大量的数据流。 在Guava中可以找到类似的功能#xff1a; IterableT Iterables.cycle(I… 由于某种原因我需要非常大的甚至可能是无限的InputStream 它会反复地反复返回相同的byte[] 。 这样我可以通过重复小样本来产生大量的数据流。 在Guava中可以找到类似的功能 IterableT Iterables.cycle(IterableT)和IteratorT Iterators.cycle(IteratorT) 。 例如如果您需要0和1的无限来源只需说出Iterables.cycle(0, 1)并无限获取Iterables.cycle(0, 1) 0, 1, 0, 1, 0, 1... 不幸的是我还没有为InputStream找到这样的工具所以我跳入自己编写的工具。 本文记录了我在此过程中犯的许多错误主要是由于过于复杂和过度设计的简单解决方案。 我们实际上不需要无限的InputStream 能够创建非常大的InputStream 例如32 GiB就足够了。 因此我们采用以下方法 public static InputStream repeat(byte[] sample, int times) 它基本上采用字节sample数组并返回一个InputStream返回这些字节。 但是当sample用完时它将翻转再次返回相同的字节-重复此过程指定的次数直到InputStream信号结束。 我尚未真正尝试过但似乎最明显的一种解决方案 public static InputStream repeat(byte[] sample, int times) {final byte[] allBytes new byte[sample.length * times];for (int i 0; i times; i) {System.arraycopy(sample, 0, allBytes, i * sample.length, sample.length);}return new ByteArrayInputStream(allBytes); } 我看到你在那里笑 如果sample是100字节并且我们需要32 GiB的输入重复这100字节则生成的InputStream不应真正分配32 GiB的内存我们在这里必须更加聪明。 事实上上面的repeat()有另一个细微的错误。 Java中的数组限制为2 31 -1个条目 int 而32 GiB远高于此。 该程序编译的原因是此处无声的整数溢出 sample.length * times 。 此乘法不适用于int 。 好的让我们尝试至少在理论上可行的方法。 我的第一个想法是如果我创建许多ByteArrayInputStream共享同一byte[] sample 它们不进行急切的复制并以某种方式将它们连接在一起怎么办 因此我需要一些InputStream适配器该适配器可以采用任意数量的基础InputStream并将它们链接在一起-当第一个流耗尽时切换到下一个。 当您在Apache Commons或Guava中寻找某些东西并且显然永远在JDK中时这一尴尬时刻…… java.io.SequenceInputStream几乎是理想的选择。 但是它只能精确地链接两个基础InputStream 。 当然由于SequenceInputStream本身就是InputStream 我们可以递归地将其用作外部SequenceInputStream的参数。 重复此过程我们可以将任意数量的ByteArrayInputStream在一起 public static InputStream repeat(byte[] sample, int times) {if (times 1) {return new ByteArrayInputStream(sample);} else {return new SequenceInputStream(new ByteArrayInputStream(sample),repeat(sample, times - 1));} } 如果times为1则将sample包装在ByteArrayInputStream 。 否则递归使用SequenceInputStream 。 我认为您可以立即发现此代码的问题太深的递归。 嵌套级别与times参数相同将达到数百万甚至数十亿。 肯定有更好的办法。 幸运的是较小的改进将递归深度从On更改为Ologn public static InputStream repeat(byte[] sample, int times) {if (times 1) {return new ByteArrayInputStream(sample);} else {return new SequenceInputStream(repeat(sample, times / 2),repeat(sample, times - times / 2));} } 老实说这是我尝试的第一个实现。 这是分而治之原理的简单应用 在这里我们将结果平均分成两个较小的子问题。 看起来很聪明但是有一个问题容易证明我们创建了t t times ByteArrayInputStreams和Ot SequenceInputStream 。 共享sample字节数组时数百万个各种InputStream实例浪费了内存。 这使我们另一种实现创建只有一个InputStream 无论价值times import com.google.common.collect.Iterators; import org.apache.commons.lang3.ArrayUtils;public static InputStream repeat(byte[] sample, int times) {final Byte[] objArray ArrayUtils.toObject(sample);final IteratorByte infinite Iterators.cycle(objArray);final IteratorByte limited Iterators.limit(infinite, sample.length * times);return new InputStream() {Overridepublic int read() throws IOException {return limited.hasNext() ?limited.next() 0xFF :-1;}}; } 毕竟我们将使用Iterators.cycle() 。 但是在我们必须将byte[]转换为Byte[]因为迭代器只能与objets一起使用而不能与原语一起使用。 没有惯用的方法ArrayUtils.toObject(byte[])语数组转换为盒装类型数组因此我使用来自Apache Commons Lang的ArrayUtils.toObject(byte[]) 。 有了对象数组我们可以创建一个infinite迭代器循环遍历sample值。 由于我们不需要无限的流因此再次使用了来自Guava的Iterators.limit(IteratorT, int)来切断无限迭代Iterators.limit(IteratorT, int) 。 现在我们只需要从IteratorByte到InputStream进行桥接–毕竟它们在语义上代表着同一件事。 该解决方案遭受两个问题。 首先由于拆箱它会产生大量垃圾。 垃圾收集并不太关心死的短命的物品但看起来仍然很浪费。 我们之前已经遇到的第二个问题 sample.length * times乘以倍数可能会导致整数溢出。 由于Iterators.limit()占用int不long 因此没有固定的理由因此无法修复。 顺便说一句我们通过做按位与避免第三个问题0xFF -否则 byte值为-1将信号流的结束这是情况并非如此。 x 0xFF被正确转换为无符号255 int 。 因此即使上面的实现是简短而甜美声明式而不是命令式的但它仍然太慢且受限制。 如果您具有C背景我可以想象您看到我挣扎时会感到多么不舒服。 在我最后想到的是最简单痛苦的简单和低级实现之后 public static InputStream repeat(byte[] sample, int times) {return new InputStream() {private long pos 0;private final long total (long)sample.length * times;public int read() throws IOException {return pos total ?sample[(int)(pos % sample.length)] :-1;}}; } 免费的GC纯JDK快速且易于理解。 给您上一课从您想到的最简单的解决方案开始不要过度设计也不要太聪明。 我以前的解决方案声明性功能性不变性等–也许它们看起来很聪明但是它们既不快速也不容易理解。 我们刚刚开发的实用程序不仅是一个玩具项目还将在后续文章中使用 。 翻译自: https://www.javacodegeeks.com/2014/07/building-extremely-large-in-memory-inputstream-for-testing-purposes.html
http://www.pierceye.com/news/973570/

相关文章:

  • 网站在百度无法验证码怎么办啊广州免费核酸检测地点查询
  • 山东网站建设公司哪家好怎么用html做个人的网页
  • 嘉兴网站排名优化价格石家庄站全景图
  • 辽宁鲲鹏建设集团网站网站建设分几种类型
  • 响应式网站开发有哪些框架建立网站的关键是定位
  • 郑州 网站建设的公司建设网站要钱么
  • 网站推广方案深圳企业网站建设服务
  • 企业网站首页设计解析网站开发服务费凭证做什么科目
  • 黄山网站网站建设网站自建设需要买什么时候开始
  • 国外seo网站海尔网站建设水平
  • 三站合一网站建设做网站王仁杰
  • 泉州seo建站wordpress ftp用户名
  • 七色板网站建设建网站一般用什么工具
  • 企业网站栏目设计网站建设求职要求
  • 秀山网站建建个网站的电话号码
  • 东莞网站开发技术公司电话杭州公共资源交易网
  • 网站建设唯地带泰安人才招聘网官方招聘
  • 备案域名一定要建好网站吗广州建企业网站
  • 移动网站建设商八爪鱼 导入 wordpress
  • 建设网站公司哪家性价比高怎么开网店找货源
  • 做图片素材的网站有哪些九宫格网站模板
  • 做网上水果网站的调查海外站推广
  • 苏州外贸公司网站建设流程图企业老板培训课程
  • 北京 做网站比较有名的网站开发html5技术
  • 优质校建设网站建行个人网上登录入口
  • 电话销售做网站打官司八里河网站建设项目建设可行性
  • 做电话销售需要的网站电商网站开发要求
  • 深圳住房和建设局网站网上预约网站和公众号的区别
  • 3g下订单的网站怎么做固定ip如何做网站服务器
  • 条友网seo做得好的企业网站