まず第一に、私の専門用語が少しアマチュアならごめんなさい、私と一緒に耐えてみてください;)
HTTP応答のgzip圧縮された本文をプレーンテキストに変換しようとしています。この応答のバイト配列を取得し、ByteArrayInputStreamに変換しました。次に、これをGZIPInputStreamに変換しました。ここで、GZIPInputStreamを読み取り、最終的な圧縮解除されたHTTP応答本文をプレーンテキスト文字列として保存します。
このコードは、最終的に解凍されたコンテンツをOutputStreamに保存しますが、コンテンツを文字列として保存したいのです。
public static int sChunk = 8192;
ByteArrayInputStream bais = new ByteArrayInputStream(responseBytes);
GZIPInputStream gzis = new GZIPInputStream(bais);
byte[] buffer = new byte[sChunk];
int length;
while ((length = gzis.read(buffer, 0, sChunk)) != -1) {
out.write(buffer, 0, length);
}
InputStreamからバイトをデコードするには、 InputStreamReader を使用できます。次に、 BufferedReader を使用すると、ストリームを1行ずつ読み取ることができます。
コードは次のようになります。
ByteArrayInputStream bais = new ByteArrayInputStream(responseBytes);
GZIPInputStream gzis = new GZIPInputStream(bais);
InputStreamReader reader = new InputStreamReader(gzis);
BufferedReader in = new BufferedReader(reader);
String readed;
while ((readed = in.readLine()) != null) {
System.out.println(readed);
}
応答は、byte[]
ではなく InputStream
として取得する必要があります。次に、 GZIPInputStream
を使用して解凍し、 InputStreamReader
を使用して文字データとして読み取り、最後に String
を使用して文字データとしてStringWriter
に書き込みます。
String body = null;
String charset = "UTF-8"; // You should determine it based on response header.
try (
InputStream gzippedResponse = response.getInputStream();
InputStream ungzippedResponse = new GZIPInputStream(gzippedResponse);
Reader reader = new InputStreamReader(ungzippedResponse, charset);
Writer writer = new StringWriter();
) {
char[] buffer = new char[10240];
for (int length = 0; (length = reader.read(buffer)) > 0;) {
writer.write(buffer, 0, length);
}
body = writer.toString();
}
// ...
最終的な目的が応答をHTMLとして解析することである場合は、このために Jsoup のようなHTMLパーサーを使用することを強くお勧めします。それは次のように簡単です:
String html = Jsoup.connect("http://google.com").get().html();
Try-with-resourcesイディオム(ブロックの終了時にtry(...)で開かれたリソースを自動的に閉じる)を使用して、コードをクリーンにします。
Apache IOUtilsを使用して、デフォルトのCharSetを使用してinputStreamをStringに変換します。
import org.Apache.commons.io.IOUtils;
public static String gzipFileToString(File file) throws IOException {
try(GZIPInputStream gzipIn = new GZIPInputStream(new FileInputStream(file))) {
return IOUtils.toString(gzipIn);
}
}
Apache Commonsを使用して、GzipInputStreamをbyteArrayに変換します。
import Java.io.InputStream;
import Java.util.Zip.GZIPInputStream;
import org.Apache.commons.io.IOUtils;
public static byte[] decompressContent(byte[] pByteArray) throws IOException {
GZIPInputStream gzipIn = null;
try {
gzipIn = new GZIPInputStream(new ByteArrayInputStream(pByteArray));
return IOUtils.toByteArray(gzipIn);
} finally {
if (gzipIn != null) {
gzipIn.close();
}
}
バイト配列の非圧縮コンテンツを文字列に変換するには、次のようにします:
String uncompressedContent = new String(decompressContent(inputStream));
StringWriter を使用して文字列に書き込むことができます
import Java.io.*;
import Java.util.Zip.*;
public class Ex1 {
public static void main(String[] args) throws Exception{
String str ;
H h1 = new H();
h1.setHcfId("PH12345658");
h1.setHcfName("PANA HEALTH ACRE FACILITY");
str = h1.toString();
System.out.println(str);
if (str == null || str.length() == 0) {
return ;
}
ByteArrayOutputStream out = new ByteArrayOutputStream(str.length());
GZIPOutputStream gzip = new GZIPOutputStream(out);
gzip.write(str.getBytes());
gzip.close();
out.close();
String s = out.toString() ;
System.out.println( s );
byte[] ba = out.toByteArray();
System.out.println( "---------------BREAK-------------" );
ByteArrayInputStream in = new ByteArrayInputStream(ba);
GZIPInputStream gzis = new GZIPInputStream(in);
InputStreamReader reader = new InputStreamReader(gzis);
BufferedReader pr = new BufferedReader(reader);
String readed;
while ((readed = pr.readLine()) != null) {
System.out.println(readed);
}
//Close all the streams
}
}
あなたもできる
try (GZIPInputStream gzipIn = new GZIPInputStream(new ByteArrayInputStream(pByteArray)))
{
....
}
AutoClosableは良いことです https://docs.Oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html