标签: gzipinputstream

C#到Java:Base64String,MemoryStream,GZipStream

我有一个在.NET中压缩过的Base64字符串,我想将其转换回Java中的字符串。我正在寻找与C#语法等效的Java,尤其是:

  • Convert.FromBase64String
  • 内存流
  • GZipStream

这是我想转换的方法:

public static string Decompress(string zipText) {
    byte[] gzipBuff = Convert.FromBase64String(zipText);

    using (MemoryStream memstream = new MemoryStream())
    {
        int msgLength = BitConverter.ToInt32(gzipBuff, 0);
        memstream.Write(gzipBuff, 4, gzipBuff.Length - 4);

        byte[] buffer = new byte[msgLength];

        memstream.Position = 0;
        using (GZipStream gzip = new GZipStream(memstream, CompressionMode.Decompress))
        {
            gzip.Read(buffer, 0, buffer.Length);
        }
        return Encoding.UTF8.GetString(buffer);
     }
}
Run Code Online (Sandbox Code Playgroud)

任何指针表示赞赏。

c# java memorystream gzipstream gzipinputstream

5
推荐指数
1
解决办法
7658
查看次数

J2ME的GZIPInputStream实现

是否有适用于J2ME的GZIPInputStream实现.我更喜欢Apache风格许可证

gzip java-me gzipinputstream

5
推荐指数
1
解决办法
1241
查看次数

GZIPInputStream在Android 2.3中因IOException失败,但在以前的所有版本中都能正常工作吗?

我今天将手机更新为Gingerbread(2.3.2)并启动了我开发的应用程序并发现它无法加载其数据.该应用程序在我从1.6到2.2测试的每个其他Android版本上运行正常,但随后在Gingerbread中出现了IOException.有人知道GZipInputStream或URL.openStream()中是否有变化吗?

有问题的代码类似于以下内容:

InputStream in = null;
GZIPInputStream zin = null;
URL url = null;
try {
    url = new URL("http://www.test.com/gzipped_data.gz");
    in = url.openStream();
    zin = new GZIPInputStream(in);
}
catch (MalformedURLException e) { 
    return false;
} 
catch (IOException e) {
    return false;
}
Run Code Online (Sandbox Code Playgroud)

在1.6到2.2中,这段代码运行正常,在2.3中我得到一个IOException,其中包含有关魔术块不正确的消息.我假设openStream发生了一些变化,搞乱了MIME类型或者这个数据上的东西.我读了其他地方,openStream不是处理HTTP连接最可靠的方法,所以这可能是重写我的连接代码的一个很好的借口.

android gzip gzipinputstream

5
推荐指数
1
解决办法
1561
查看次数

GZIPInputStream 和字符集

我有一个包含拉丁文、西里尔文和汉字的文本。我尝试使用 GZIPInputStream压缩字符串(超过bytes[]GZIPOutputStream并解压缩它。但我无法将所有字符转换回原始字符。有些显示为?

我认为 UTF-16 可以完成这项工作。

有什么帮助吗?

问候

这是我的代码:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import java.util.zip.Inflater;
import java.util.zip.ZipException;

public class CompressUncompressStrings {

    public static void main(String[] args) throws UnsupportedEncodingException {

        String sTestString="äöüäöü ??";
        System.out.println(sTestString);
        byte bcompressed[]=compress(sTestString.getBytes("UTF-16"));
        //byte bcompressed[]=compress(sTestString.getBytes());
        String sDecompressed=decompress(bcompressed);
        System.out.println(sDecompressed);
    }
    public static byte[] compress(byte[] content){
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try{
            GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
            gzipOutputStream.write(content);
            gzipOutputStream.close();
        } catch(IOException …
Run Code Online (Sandbox Code Playgroud)

java compression gzipinputstream

5
推荐指数
1
解决办法
2146
查看次数

如何使用Content-Encoding读取压缩的HTML页面:gzip

我请求一个发送Content-Encoding:gzip标头的网页,但却被卡住了怎么读它..

我的代码:

    try {
        URLConnection connection = new URL("http://jquery.org").openConnection();                        
        String html = "";
        BufferedReader in = null;
        connection.setReadTimeout(10000);
    in = new BufferedReader(new InputStreamReader(connection.getInputStream()));            
    String inputLine;
    while ((inputLine = in.readLine()) != null){
    html+=inputLine+"\n";
        }
    in.close();
        System.out.println(html);
        System.exit(0);
    } catch (IOException ex) {
        Logger.getLogger(Crawler.class.getName()).log(Level.SEVERE, null, ex);
    }
Run Code Online (Sandbox Code Playgroud)

输出看起来很乱.(我无法在这里粘贴它,一种符号......)

我相信这是一个压缩内容,如何解析呢?

注意:
如果我将jquery.org更改为jquery.com(不发送该标头,我的代码运行良好)

java gzipinputstream

5
推荐指数
2
解决办法
8141
查看次数

Java:如何将InputStream转换为GZIPInputStream?

我有一个方法

      public void put(@Nonnull final InputStream inputStream, @Nonnull final String uniqueId) throws PersistenceException {
        // a.) create gzip of inputStream
        final GZIPInputStream zipInputStream;
        try {
            zipInputStream = new GZIPInputStream(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
            throw new PersistenceException("Persistence Service could not received input stream to persist for " + uniqueId);
        }
Run Code Online (Sandbox Code Playgroud)

我想转换inputStreamzipInputStream,这样做的方法是什么?

  • 上面的方法不正确,并抛出异常为"不是Zip格式"

将Java Streams转换为我真的很混乱,我没有让它们正确

java inputstream gzipinputstream

5
推荐指数
2
解决办法
6647
查看次数

Dataflow GZIP TextIO ZipException:长度或距离符号太多

使用带有大量压缩文本文件(1000多个文件,大小在100MB和1.5GB之间)的TextIO.Read转换,我们有时会收到以下错误:

java.util.zip.ZipException: too many length or distance symbols at
java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164) at
java.util.zip.GZIPInputStream.read(GZIPInputStream.java:117) at
java.io.BufferedInputStream.fill(BufferedInputStream.java:246) at
java.io.BufferedInputStream.read1(BufferedInputStream.java:286) at
java.io.BufferedInputStream.read(BufferedInputStream.java:345) at
java.io.FilterInputStream.read(FilterInputStream.java:133) at
java.io.PushbackInputStream.read(PushbackInputStream.java:186) at 
com.google.cloud.dataflow.sdk.runners.worker.TextReader$ScanState.readBytes(TextReader.java:261) at 
com.google.cloud.dataflow.sdk.runners.worker.TextReader$TextFileIterator.readElement(TextReader.java:189) at 
com.google.cloud.dataflow.sdk.runners.worker.FileBasedReader$FileBasedIterator.computeNextElement(FileBasedReader.java:265) at 
com.google.cloud.dataflow.sdk.runners.worker.FileBasedReader$FileBasedIterator.hasNext(FileBasedReader.java:165) at 
com.google.cloud.dataflow.sdk.util.common.worker.ReadOperation.runReadLoop(ReadOperation.java:169) at 
com.google.cloud.dataflow.sdk.util.common.worker.ReadOperation.start(ReadOperation.java:118) at 
com.google.cloud.dataflow.sdk.util.common.worker.MapTaskExecutor.execute(MapTaskExecutor.java:66) at 
com.google.cloud.dataflow.sdk.runners.worker.DataflowWorker.executeWork(DataflowWorker.java:204) at 
com.google.cloud.dataflow.sdk.runners.worker.DataflowWorker.doWork(DataflowWorker.java:151) at 
com.google.cloud.dataflow.sdk.runners.worker.DataflowWorker.getAndPerformWork(DataflowWorker.java:118) at 
com.google.cloud.dataflow.sdk.runners.worker.DataflowWorkerHarness$WorkerThread.call(DataflowWorkerHarness.java:139) at 
com.google.cloud.dataflow.sdk.runners.worker.DataflowWorkerHarness$WorkerThread.call(DataflowWorkerHarness.java:124) at
java.util.concurrent.FutureTask.run(FutureTask.java:266) at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at
java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)

在线搜索相同的ZipException,只会导致此回复:

当热部署程序在将应用程序完全复制到deploy目录之前尝试部署应用程序时,通常会发生Zip文件错误.如果复制文件需要几秒钟,这是相当常见的.解决方案是将文件复制到与应用程序服务器相同的磁盘分区上的临时目录,然后将该文件移动到deploy目录.

有没有其他人遇到类似的例外?或者无论如何我们可以解决这个问题?

java gzipinputstream google-cloud-dataflow

5
推荐指数
1
解决办法
5024
查看次数

在 GZIPInputStream 中包装 BodySubscriber<InputStream> 会导致挂起

我正在使用新java.net.http类来处理异步 HTTP 请求+响应交换,并且我正在尝试找到一种方法让 BodySubscriber 处理不同的编码类型(例如 gzip)。

但是,映射 aBodySubsriber<InputStream>以使底层流被 a 包装GZIPInputStream(当在响应标头中找到“Content-Encoding:gzip”时)会导致挂起。没有例外,只是完全停止活动。

映射的代码BodySubscriber如下所示:

private HttpResponse.BodySubscriber<InputStream> gzippedBodySubscriber(
        HttpResponse.ResponseInfo responseInfo) {
    return HttpResponse.BodySubscribers.mapping(
            HttpResponse.BodySubscribers.ofInputStream(),
            this::decodeGzipStream);
}

private InputStream decodeGzipStream(InputStream gzippedStream) {
    System.out.println("Entered decodeGzipStream method.");
    try {
        InputStream decodedStream = new GZIPInputStream(gzippedStream);
        System.out.println(
                "Created GZIPInputStream to handle response body stream.");
        return decodedStream;
    } catch (IOException ex) {
        System.out.println("IOException occurred while trying to create GZIPInputStream.");
        throw new UncheckedIOException(ex);
    }
}
Run Code Online (Sandbox Code Playgroud)

接收到具有“gzip”编码的 HTTP 响应会导致控制台显示以下内容:

进入EncodedBodyHandler.apply方法。
进入decodeGzipStream方法。

没有看到更多内容,因此调用GZIPInputStream构造函数之后的行永远不会执行。 …

java gzipinputstream java-http-client

5
推荐指数
1
解决办法
1390
查看次数

GZIPInputStream抛出未知格式(幻数213c)

虽然我使用GZIPInputStream来压缩来自Internet的字节,但程序运行错误如下:

05-08 17:37:02.465: W/System.err(744): java.io.IOException: unknown format (magic number 213c)
05-08 17:37:02.465: W/System.err(744):  at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:84)
05-08 17:37:02.465: W/System.err(744):  at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:64)
05-08 17:37:02.475: W/System.err(744):  at com.Android.Sample.TestActivity.onCreate(TestActivity.java:54)
05-08 17:37:02.475: W/System.err(744):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-08 17:37:02.475: W/System.err(744):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
05-08 17:37:02.475: W/System.err(744):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
05-08 17:37:02.475: W/System.err(744):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
05-08 17:37:02.475: W/System.err(744):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
05-08 17:37:02.475: W/System.err(744):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-08 17:37:02.475: W/System.err(744):  at android.os.Looper.loop(Looper.java:123)
05-08 17:37:02.475: W/System.err(744):  at android.app.ActivityThread.main(ActivityThread.java:3683)
05-08 17:37:02.475: W/System.err(744):  at java.lang.reflect.Method.invokeNative(Native Method)
05-08 17:37:02.475: W/System.err(744):  at java.lang.reflect.Method.invoke(Method.java:507)
05-08 17:37:02.475: W/System.err(744):  at …
Run Code Online (Sandbox Code Playgroud)

android gzip httpconnection gzipinputstream

4
推荐指数
1
解决办法
1万
查看次数

流解码Base64数据

我有一些大的base64编码数据(存储在hadoop文件系统中的snappy文件中).这个数据最初是gzip压缩的文本数据.我需要能够读取这些编码数据的块,对其进行解码,然后将其刷新到GZIPOutputStream.

有关如何执行此操作而不是将整个base64数据加载到数组并调用Base64.decodeBase64(byte [])的任何想法?

如果我将字符读到'\ r \n'分隔符并逐行解码,我是对的吗?例如:

for (int i = 0; i < byteData.length; i++) {
    if (byteData[i] == CARRIAGE_RETURN || byteData[i] == NEWLINE) {
       if (i < byteData.length - 1 && byteData[i + 1] == NEWLINE)
            i += 2;
       else 
            i += 1;

       byteBuffer.put(Base64.decodeBase64(record));

       byteCounter = 0;
       record = new byte[8192];
    } else {
        record[byteCounter++] = byteData[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这种方法并没有给出任何人类可读的输出.理想情况下,我想流式读取,解码和流出数据.

现在,我正在尝试输入一个输入流,然后复制到一个gzipout

byteBuffer.get(bufferBytes);

InputStream inputStream = new ByteArrayInputStream(bufferBytes);
inputStream = new GZIPInputStream(inputStream);
IOUtils.copy(inputStream , gzipOutputStream);
Run Code Online (Sandbox Code Playgroud)

它给了我一个java.io.IOException:Corrupt GZIP预告片

java base64 hadoop gzipinputstream

4
推荐指数
1
解决办法
8826
查看次数