質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

5157閲覧

Java で ZipOutputStream を byte配列へ変換したい

tsukari

総合スコア7

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/02/17 13:43

zip ファイルの中のファイルの内容を少し変更して、変更した zip ファイルを BLOB 型のカラムに保存しようと考えています。

zip ファイルの読み込みには、ZipInputStream、ZipEntry を使っています。(これは問題ありません。)
変更用には ByteArrayOutputStream を使用しているのですが、処理の最後に ZipOutputStream を byte[] にする方法が分かりません。
※byte[] を BLOB のカラムに登録したいので。

ByteArrayOutputStream を使って、stream.read なんて感じで変換しようと試みましたが、ByteArrayOutputStream には read メソッドはありませんでした。
そのため、ByteArrayOutputStream を toByteArray することもできませんでした。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsukari

2020/02/17 23:58

早速コメントいただきありがとうございます。参考に教えていただいたサイトを見本に実装してみます。 結果は改めてご連絡いたします。
tsukari

2020/02/18 05:40

public static byte[] zipBytes(String filename, byte[] input) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ZipOutputStream zos = new ZipOutputStream(baos); ZipEntry entry = new ZipEntry(filename); entry.setSize(input.length); zos.putNextEntry(entry); zos.write(input); zos.closeEntry(); zos.close(); return baos.toByteArray(); } が参考になりました。
tsukari

2020/02/18 05:51

xebmeさんにベストアンサーを付けるのはどうすれば良いのでしょうか?
guest

回答1

0

自己解決

参考にさせていただいた内容をもとに、以下のように実装しました。
※パラメータの inputStream は MultipartFile から作成したもので、zip ファイルです。

バイト配列の取得位置が try-with-resources ではまだ ZipOutputStream を close していない場所だったので、ret = baos.toByteArray(); の前に、明示的に zipOutStream.close(); を入れました。

これで、7-zipの場合の解凍時のペイロードのメッセージも無くなり、また、Windowsエクスプローラでのダブルクリックでも解凍できるようになりました。

public byte[] sampleZip(InputStream inputStream) { byte[] ret = new byte[1048476]; ZipEntry zipEntry; ZipEntry zipOutputEntry; try (ZipInputStream zipInStream = new ZipInputStream(new BufferedInputStream(inputStream), Charset.forName("SJIS")); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ZipOutputStream zipOutStream = new ZipOutputStream(baos);) { while ((zipEntry = zipInStream.getNextEntry()) != null) { if (zipEntry.isDirectory()) { continue; } String entryName = FilenameUtils.getName(zipEntry.getName()); // FilenameUtils:独自のクラス String fileName = FilenameUtils.getBaseName(entryName); String fileExt = FilenameUtils.getExtension(entryName); SCOPE: { if (StringUtils.isEmpty(fileName) || fileName.length() < 5 || StringUtils.isEmpty(fileExt)) { break SCOPE; } byte[] fileBin = IOUtils.toByteArray(zipInStream); if (fileBin.length <= 0) { break SCOPE; } if (!(fileExt.equals("xls") || fileExt.equals("xlsx"))) { zipOutputEntry = new ZipEntry(entryName); zipOutputEntry.setSize(fileBin.length); zipOutStream.putNextEntry(zipOutputEntry); zipOutStream.write(fileBin); break SCOPE; } XSSFWorkbook workbook = new XSSFWorkbook(); workbook = addSheet(new ByteArrayInputStream(fileBin)); // addSheet:独自の関数 fileBin = getBytes(workbook); if (workbook != null) { workbook.close(); zipOutputEntry = new ZipEntry(entryName); zipOutputEntry.setSize(fileBin.length); zipOutStream.putNextEntry(zipOutputEntry); zipOutStream.write(fileBin); } } zipInStream.closeEntry(); zipOutStream.closeEntry(); } zipOutStream.close(); //追加 2020.03.05 ret = baos.toByteArray(); } catch (Exception e) { ret = null; } return ret; }

投稿2020/02/18 05:45

編集2020/03/05 06:19
tsukari

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsukari

2020/03/04 08:38

解決した方法の baos.toByteArray() にて zip ファイルのバイト配列はできましたが、そのバイト配列から作成したファイルは 7-zip 等でしか解凍できませんでした。(※Windowsエクスプローラーでのダブルクリックでは解凍不可) やはり一度ファイルに出力し、Files.readAllBytes でバイト配列にしなければならないかもしれません。
tsukari

2020/03/05 06:20

実ファイルへの出力は回避できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問