我有一个在.NET中压缩过的Base64字符串,我想将其转换回Java中的字符串。我正在寻找与C#语法等效的Java,尤其是:
这是我想转换的方法:
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)
任何指针表示赞赏。
是否有适用于J2ME的GZIPInputStream实现.我更喜欢Apache风格许可证
我今天将手机更新为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连接最可靠的方法,所以这可能是重写我的连接代码的一个很好的借口.
我有一个包含拉丁文、西里尔文和汉字的文本。我尝试使用 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) 我请求一个发送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(不发送该标头,我的代码运行良好)
我有一个方法
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)
我想转换inputStream成zipInputStream,这样做的方法是什么?
将Java Streams转换为我真的很混乱,我没有让它们正确
使用带有大量压缩文本文件(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.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构造函数之后的行永远不会执行。 …
虽然我使用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) 我有一些大的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预告片
gzipinputstream ×10
java ×7
gzip ×3
android ×2
base64 ×1
c# ×1
compression ×1
gzipstream ×1
hadoop ×1
inputstream ×1
java-me ×1
memorystream ×1