はじめに
.textを圧縮したzipファイルをUIからjavaに渡し、解凍➡テキストファイルの中身を一行ずつリストに追加する方法で詰まったため、実装方法を記載します。
ソースコード
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.File;
public static List<String> zipKaito(MultipartFile uploadFile) {
List<String> list = new ArrayList<String>();
String line = null;
BufferedReader br = null;
try {
File zipFile = new File(uploadFile.getOriginalFilename());
zipFile.createNewFile();
Charset c;
c = Charset.forName("MS932");
ZipInputStream ziStr = new ZipInputStream(new FileInputStream(zipFile), c);
InputStreamReader iStr = new InputStreamReader(ziStr);
br = new BufferedReader(iStr);
for (ZipEntry ze = ziStr.getNextEntry(); ze != null; ze = ziStr.getNextEntry()) {
while ((line = br.readLine()) != null) {
System.out.println(line);
list.add(line);
}
ziStr.closeEntry();
}
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
解説
・uploadFileという名前でUIから引数にわたってきたzipファイルを扱います。
・File.createNewFile()を扱うことで引数で渡ってきたzipファイルを作成いたします。
・ZipInputStreamで解凍するzipファイル用の入力ストリームを作り、InputStreamReaderで中身のテキストファイルを読み込みます。
・getNextEntryで次のエントリを取得し、BufferedReaderのreadLineを使ってテキストファイルを1行ずつ読み込み、都度リストに追加する形で実装を行いました。
文字コードについて
Charset cで指定しているように、文字コードの設定を適切に行わない場合にmalformedInputExceptionが起きてしまうことがあります。
ZIP解凍をjavaで対応する際、ZipInputStreamの第二引数に文字コードを指定することで回避する必要があり、今回の記事ではwindowsの標準日本語コードである「MS932」としました。
ファイルの文字コードにも注意する必要があります。。
終わりに
zipファイルの解凍についての記事はよく見られますが、UIからzipファイルを渡してjavaで解凍するというドンピシャな記事がなかったため今回投稿させていただきました。
参考
・MalformedInputException
https://docs.oracle.com/javase/jp/8/docs/api/java/nio/charset/MalformedInputException.html
・クラス File
https://docs.oracle.com/javase/jp/7/api/java/io/File.html
・Java MS932とShift_JISの違い
https://itsakura.com/it-shiftjis-ms932
・Java言語で記述した ZIPファイル解凍アプリで MALFORMEDの例外が発生した
http://www.neko.ne.jp/~freewing/software/java_unzip_zipcoder_malformed_exception/
・ZipInputStreamから文字列を取り出す
http://blog.justoneplanet.info/2014/05/07/zipinputstream%E3%81%8B%E3%82%89%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99/