我有以下代码来压缩和解压缩字符串.
public static byte[] compress(String str)
{
try
{
ByteArrayOutputStream obj = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(obj);
gzip.write(str.getBytes("UTF-8"));
gzip.close();
return obj.toByteArray();
}
catch (IOException e)
{
e.printStackTrace();
}
return null;
}
public static String decompress(byte[] bytes)
{
try
{
GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(bytes));
BufferedReader bf = new BufferedReader(new InputStreamReader(gis, "UTF-8"));
StringBuilder outStr = new StringBuilder();
String line;
while ((line = bf.readLine()) != null)
{
outStr.append(line);
}
return outStr.toString();
}
catch (IOException e)
{
return e.getMessage();
} …
Run Code Online (Sandbox Code Playgroud) 我试图通过 java 套接字发送压缩的 HTML 文件,但浏览器显示一个空的 HTML 文件。
问题是,当我尝试发送未压缩的 HTML 时,发现一切正常(是的,我确实相应地修改了 HTTP 标头)。
private void sendResponse(String headers, String body) throws IOException
{
BufferedOutputStream output = new BufferedOutputStream(
this.SOCKET.getOutputStream());
byte[] byteBody = null;
// GZIP compression
if(body != null && this.encoding.contains("gzip"))
{
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
GZIPOutputStream zipStream = new GZIPOutputStream(byteStream);
zipStream.write(body.getBytes(this.charset));
zipStream.flush();
byteBody = byteStream.toByteArray();
byteStream.flush();
byteStream.close();
zipStream.close();
}
else
byteBody = body.getBytes(this.charset);
// Sending response
byte[] msg1 = (Integer.toHexString(byteBody.length) + "\r\n")
.getBytes(this.charset);
byte[] msg2 = byteBody;
byte[] msg3 = …
Run Code Online (Sandbox Code Playgroud) Main.java
import java.io.IOException;
public class Main
{
private final CompressedOutputStream m_cos;
public static void main(String[] args)
{
try
{
final Main m = new Main(new CompressedOutputStream());
m.run();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public Main(final CompressedOutputStream cos)
{
this.m_cos = cos;
}
private void trace(final String format, Object... args)
{
final String output = String.format(format, args);
System.out.println(output);
}
public void run()
{
this.first_write();
this.second_write();
this.trace("CRC32 of data is %x", this.m_cos.get_crc32());
}
private void add_data(final byte[] data)
{
try …
Run Code Online (Sandbox Code Playgroud) 我需要将字符串转换为 gzip base64。我有这个代码
import java.util.zip.GZIPOutputStream;
import org.apache.commons.codec.binary.Base64OutputStream;
public class Test {
public static void main(String[] args) {
String text = "a string of characters";
try {
ByteArrayOutputStream os = new ByteArrayOutputStream();
Base64OutputStream b64os = new Base64OutputStream(os);
GZIPOutputStream gzip = new GZIPOutputStream(b64os);
gzip.write(text.getBytes("UTF-8"));
String base64 = new String(os.toByteArray(),"UTF-8");
gzip.close();
b64os.close();
System.out.print(base64)
} catch (Throwable t) {
t.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我需要得到H4sIAAAAAAAAAEtUKC4pysxLV8hPU0jOSCxKTC5JLSoGAOP+cfkWAAAA
。为什么我得到这个输出?
H4sIAAAAAAAA
Run Code Online (Sandbox Code Playgroud) 在try-with-resources [autoclosable]块中使用GZipOutputStream时,我在处理完资源finish()
后是否需要显式调用?
我正在使用创建tar.Gzip
文件,GZIPOutputStream
并且添加了另一个逻辑,即如果在压缩文件时捕获到任何异常,我的代码将重试3次。
当我抛出一个IOException
测试我的重试逻辑时,它抛出下面的异常:
java.io.IOException: request to write '4096' bytes exceeds size in header of '2644' bytes for entry 'Alldbtypes'
我在行上收到异常: org.apache.commons.io.IOUtils.copyLarge(inputStream, tarStream);
private class CompressionStream extends GZIPOutputStream {
// Use compression levels from the deflator class
public CompressionStream(OutputStream out, int compressionLevel) throws IOException {
super(out);
def.setLevel(compressionLevel);
}
}
public void createTAR(){
boolean isSuccessful=false;
int count = 0;
int maxTries = 3;
while(!isSuccessful) {
InputStream inputStream =null;
FileOutputStream outputStream =null;
CompressionStream compressionStream=null;
OutputStream md5OutputStream = null; …
Run Code Online (Sandbox Code Playgroud)