大家好,我又来了,具体问题:获取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()
//接下来都是无用代码,省略
读取过程如下:
按说260M的文件,一次读取50M,读取六次就够了;但现在结果是每次只read了128K,声明的byte数组长度没用;也追了追源码,确实找到了131072的由来;但本人才疏学浅,实在不知道调整哪里,望大家不吝赐教,多谢
追的源码在网站找了个博主的记录,我这里也就直接借用一下,curDataSlice的值就是131072,也尝试修改了hadoop配置文件中的和文件大小相关耳朵配置,但最终也没解决,