gpt4 book ai didi

java - 在 Google App Engine 上用 java 解压缩一个大 blob

转载 作者:行者123 更新时间:2023-12-04 19:33:46 25 4
gpt4 key购买 nike

我正在使用 Java (JDO) 在 Google App Engine 上构建一些东西。我正在使用 Deflater 以编程方式压缩一个大 byte[],然后将压缩后的 byte[] 存储在 blobstore 中。这很好用:

 public class Functions {

public static byte[] compress(byte[] input) throws UnsupportedEncodingException, IOException, MessagingException
{

Deflater df = new Deflater(); //this function mainly generate the byte code
df.setLevel(Deflater.BEST_COMPRESSION);
df.setInput(input);

ByteArrayOutputStream baos = new ByteArrayOutputStream(input.length); //we write the generated byte code in this array
df.finish();
byte[] buff = new byte[1024]; //segment segment pop....segment set 1024
while(!df.finished())
{
int count = df.deflate(buff); //returns the generated code... index
baos.write(buff, 0, count); //write 4m 0 to count
}
baos.close();

int baosLength = baos.toByteArray().length;
int inputLength = input.length;
//System.out.println("Original: "+inputLength);
// System.out.println("Compressed: "+ baosLength);

return baos.toByteArray();

}

public static byte[] decompress(byte[] input) throws UnsupportedEncodingException, IOException, DataFormatException
{

Inflater decompressor = new Inflater();
decompressor.setInput(input);

// Create an expandable byte array to hold the decompressed data
ByteArrayOutputStream bos = new ByteArrayOutputStream(input.length);

// Decompress the data
byte[] buf = new byte[1024];
while (!decompressor.finished()) {
try {
int count = decompressor.inflate(buf);
bos.write(buf, 0, count);
} catch (DataFormatException e) {
}
}
try {
bos.close();
} catch (IOException e) {
}

// Get the decompressed data
byte[] decompressedData = bos.toByteArray();

return decompressedData;


}

public static BlobKey putInBlobStore(String contentType, byte[] filebytes) throws IOException {

// Get a file service
FileService fileService = FileServiceFactory.getFileService();


AppEngineFile file = fileService.createNewBlobFile(contentType);

// Open a channel to write to it
boolean lock = true;
FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock);

// This time we write to the channel using standard Java
BufferedInputStream in = new BufferedInputStream(new ByteArrayInputStream(filebytes));
byte[] buffer;
int defaultBufferSize = 524288;
if(filebytes.length > defaultBufferSize){
buffer = new byte[defaultBufferSize]; // 0.5 MB buffers
}
else{
buffer = new byte[filebytes.length]; // buffer the size of the data
}

int read;
while( (read = in.read(buffer)) > 0 ){ //-1 means EndOfStream
System.out.println(read);
if(read < defaultBufferSize){
buffer = new byte[read];
}
ByteBuffer bb = ByteBuffer.wrap(buffer);
writeChannel.write(bb);
}
writeChannel.closeFinally();

return fileService.getBlobKey(file);
}
}

在我的 Functions 类中使用静态 compress() 和 putInBlobStore() 函数,我可以像这样压缩和存储一个 byte[]:

BlobKey dataBlobKey =  Functions.putInBlobStore("MULTIPART_FORM_DATA", Functions.compress(orginalDataByteArray));

很甜。我真的很喜欢GAE。

但是现在,问题是:

我正在存储压缩的 HTML,我想即时检索和解压缩以显示在 JSP 页面内的 iframe 中。压缩很快,但解压需要永远!即使压缩后的 HTML 为 15k,有时解压也会死掉。

这是我的解压方法:

 URL file = new URL("/blobserve?key=" + htmlBlobKey);
URLConnection conn = file.openConnection();
conn.setReadTimeout(30000);
conn.setConnectTimeout(30000);
InputStream inputStream = conn.getInputStream();
byte[] data = IOUtils.toByteArray(inputStream);
return new String(Functions.decompress(data));

关于如何最好地从 blobstore 中获取压缩的 HTML、解压缩并显示它有什么想法吗?即使我需要将它传递给任务队列并在显示进度条的同时轮询完成 - 那也没关系。我真的不在乎,只要它有效并且最终有效即可。如果您能在这里与我分享任何指导,我将不胜感激。

感谢您的帮助。

最佳答案

您可以查看运行异步的 RequestBuilder

RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET,"/blobserve?key=" + htmlBlobKey);
try {
requestBuilder.sendRequest(null, new RequestCallback() {
public void onError(Request request, Throwable exception) {
GWT.log(exception.getMessage());
}
public void onResponseReceived(Request request, Response response) {
doSomething(response.getText());//here update your iframe and stop progress indicator
}
});
} catch (RequestException ex) {
GWT.log(ex.getMessage());
}

关于java - 在 Google App Engine 上用 java 解压缩一个大 blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7493834/

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