我不想名字重复 2022-09-26 15:03 采纳率: 0%
浏览 17
已结题

hdfs文件流封装为压缩流一次读写128K

大家好,我又来了,具体问题:获取hadoop上的一个文件,由于需求,需要封装为zip流返回,但read时,虽然声明的数组是50M,但每次还是只读了131072字节(128K);由于不耽误业务的使用,所以放在那没优化,但最近业务出问题了,在排查;所以想把这里优化下,具体代码如下:
val aa:String = "hdfs://127.0.0.1:9000/test/my_test.jar"
//调用封好的工具类,返回FSDataInputStream文件流
val inputStream:FSDataInputStream= HdfsUtil.getFSDataInputStream(aa)
val byteArrayOutputStream = new ByteArrayOutputStream()
//创建压缩流
val zos = new ZipOutputStream(byteArrayOutputStream)
val jarName = jarPath.substring(jarPath.lastIndexOf("/")+1)
val zipEntry:ZipEntry = new ZipEntry(jarName)
zos.putNextEntry(zipEntry)
var flag = true
var index = 0;
var i:Int = 0;
while(flag){
    //循环read Hdfs的文件流
    val byte:Array[Byte] =new Array[Byte](1024*1024);
    index = inputStream.read(byte,0,byte.length)
    //打印一下每次读取的字节数
    println("----------------------index------------------:"+index)
    if (index>0){
      i=i+1;
      //这个文件读取了多少次
      println("--------------i---------------:"+i)
      zos.write(byte,0,index)
    }else{
      flag = false
    }
}
zos.closeEntry()
zos.close()

//接下来都是无用代码,省略
读取过程如下:

img

按说260M的文件,一次读取50M,读取六次就够了;但现在结果是每次只read了128K,声明的byte数组长度没用;也追了追源码,确实找到了131072的由来;但本人才疏学浅,实在不知道调整哪里,望大家不吝赐教,多谢

追的源码在网站找了个博主的记录,我这里也就直接借用一下,curDataSlice的值就是131072,也尝试修改了hadoop配置文件中的和文件大小相关耳朵配置,但最终也没解决,

img

想要达到的效果:read时能按照我声明的byte数组大小读取字节(至少不能是现在每次读取128K)
  • 写回答

1条回答 默认 最新

  • 我不想名字重复 2022-09-26 15:27
    关注

    顶一下,不要沉了啊!!!!

    评论

报告相同问题?

问题事件

  • 系统已结题 10月4日
  • 创建了问题 9月26日

悬赏问题

  • ¥15 Apache显示系统错误3该如何解决?
  • ¥30 uniapp小程序苹果手机加载gif图片不显示动效?
  • ¥20 js怎么实现跨域问题
  • ¥15 C++dll二次开发,C#调用
  • ¥15 请教,如何使用C#加载本地摄像头进行逐帧推流
  • ¥15 Python easyocr无法顺利执行,如何解决?
  • ¥15 为什么会突然npm err!啊
  • ¥15 java服务连接es读取列表数据,服务连接本地es获取数据时的速度很快,但是换成远端的es就会非常慢,这是为什么呢
  • ¥15 vxworks交叉编译gcc报错error: missing binary operator before token "("
  • ¥15 JSzip压缩文件时如何设置解压缩密码