항상 읽기보다 적은 바이트가 반환 될 수 있으므로 일반적으로 항상 원하는만큼 루프를 반복해야합니다.
즉, GZIPInputStream
에 큰 버퍼를 지정해도 주어진 요청에 채워질 것이라는 의미는 아닙니다. 그래서 그 대신, loop to drain 대신 하나 개의 읽기를 발행
import java.util.zip.GZIPInputStream
import java.io.FileInputStream
import java.io.File
import java.io.InputStream
import java.io.FilterInputStream
object Unzipped extends App {
val inputFileName = "/tmp/sss.gz"
val bArray = new Array[Byte](80 * 1024)
val fis = new FileInputStream(new File(inputFileName))
val stingy = new StingyInputStream(fis)
val gis = new GZIPInputStream(stingy, 80 * 1024)
val bytesRead = gis.read(bArray, 0, bArray.length)
println(bytesRead)
}
class StingyInputStream(is: InputStream) extends FilterInputStream(is) {
override def read(b: Array[Byte], off: Int, len: Int) = {
val n = len.min(1024)
super.read(b, off, n)
}
}
:
import reflect.io.Streamable.Bytes
val sb = new Bytes {
override val length = 80 * 1024L
override val inputStream = gis
}
val res = sb.toByteArray()
println(res.length) // your explicit length
나는 그냥 데모로의, 즉 사용하는 API입니다 말하고 있지 않다. 나는 루프를 작성하기에는 너무 게으른 편이다.
읽고있는 파일의 크기는 어느 정도입니까? – raam86
샘플 루프 : https://github.com/scala/scala/blob/2.12.x/src/reflect/scala/reflect/io/Streamable.scala#L59 –
@ som-snytt : 샘플에 gzip 라이브러리. – pythonic