gpt4 book ai didi

java - 如何从 InputStream 中解压文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:17:54 25 4
gpt4 key购买 nike

我正在尝试从服务器获取一个 zip 文件。我正在使用 HttpURLConnection 获取 InputStream,这就是我所拥有的:

myInputStream.toString().getBytes().toString()  is equal to [B@4.....

byte[] bytes = Base64.decode(myInputStream.toString(), Base64.DEFAULT);
String string = new String(bytes, "UTF-8");
string == �&ܢ��z�m����y....

我真的尝试解压这个文件,但没有任何效果,还有很多问题,我应该使用 GZIPInputStream 还是 ZipInputStream?我是否必须将此流另存为文件,或者我可以处理 InputStream

请帮忙,我的老板越来越不耐烦了:O我不知道这个文件里有什么我必须找出来:)

最佳答案

GZipInputStream 和 ZipInputStream 是两种不同的格式。 https://en.wikipedia.org/wiki/Gzip

直接从流中检索字符串不是一个好主意。您可以从 InputStream 创建一个文件并使用 FileOutputStream 将数据写入其中。

Base 64 解码是另外一回事。如果你的流已经解码了上游的格式,那没关系;否则你必须用另一个解码 Base64 格式的输入流来封装你的流。最佳做法是使用缓冲区来避免内存溢出。

下面是一些 Kotlin 代码,用于将压缩到文件中的 InputStream 解压缩。 (比java简单,因为byte[]的管理比较繁琐):

val fileBinaryDecompress = File(..path..)
val outputStream = FileOutputStream(fileBinaryDecompress)

readFromStream(ZipInputStream(myInputStream), BUFFER_SIZE_BYTES,
object : ReadBytes {
override fun read(buffer: ByteArray) {
outputStream.write(buffer)
}
})
outputStream.close()

interface ReadBytes {
/**
* Called after each buffer fill
* @param buffer filled
*/
@Throws(IOException::class)
fun read(buffer: ByteArray)
}

@Throws(IOException::class)
fun readFromStream(inputStream: InputStream, bufferSize: Int, readBytes: ReadBytes) {
val buffer = ByteArray(bufferSize)
var read = 0
while (read != -1) {
read = inputStream.read(buffer, 0, buffer.size)
if (read != -1) {
val optimizedBuffer: ByteArray = if (buffer.size == read) {
buffer
} else {
buffer.copyOf(read)
}
readBytes.read(optimizedBuffer)
}
}
}

如果你想从服务器获取文件而不解压它,移除 ZipInputStream() 装饰器。

关于java - 如何从 InputStream 中解压文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32092798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com