top / index / prev / next / target / source

2007-10-03 diary: Java: 圧縮・解凍API調べ中…

いがぴょんの日記 日記形式でつづる いがぴょんコラム ウェブページです。

old-v2

Java: 圧縮・解凍API調べ中…

@ITの記事執筆のために、Javaの 圧縮・解凍APIを調べ中です。 , Eclipse 3.3言語パックを待望中…

Java: 圧縮・解凍API調べ中…

@ITの記事執筆のために、Javaの 圧縮・解凍APIを調べ中です。

今回記事内容として扱うのは下記

ああ、java.util.zipは GZIPもサポートするのですね…。今思い出しました。

さて、imageioのほうは、、、

なんか 難しそうです。

ZIPファイルの作成および読み込み

結構 ZIPファイル入出力だけでも どっしりとした内容です。UTF-8によるファイル名 文字エンコーディングも 頭が痛い内容です。

作成

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * ZIPファイルを作成するサンプルです。
 * 
 * 前提条件: ファイル名は UTF-8でエンコードされているものと仮定します。一般的に流通している Windowsアーカイバでは
 * 日本語ファイル名を正しく読み込むことは出来ません。
 * 
 * @author iga
 * 
 */
public class CreateZipSample {
    public static void main(String[] args) {
        try {
            final File file = new File("zipsample.zip");
            System.out.println("ZIPファイル作成: 開始: " + file.getAbsolutePath());
            new CreateZipSample().process(file);
            System.out.println("ZIPファイル作成: 終了");
        } catch (IOException e) {
            System.out.println("ZIPファイル作成中に例外が発生しました。処理中断します:" + e.toString());
        }
    }

    /**
     * ZIPファイルを作成します。
     * 
     * @param file
     *            出力するZIPファイル。
     * @throws IOException
     *             入出力例外が発生した場合。
     */
    public void process(final File file) throws IOException {
        final ZipOutputStream zipOutStream = new ZipOutputStream(
                new BufferedOutputStream(new FileOutputStream(file)));
        try {
            {
                final ZipEntry entry = new ZipEntry("ABC/ABC.txt");
                zipOutStream.putNextEntry(entry);
                // ファイルデータの書き込み。
                zipOutStream.write(new String("あいうえお").getBytes());
                zipOutStream.closeEntry();
            }

            {
                final ZipEntry entry = new ZipEntry("ABC/DEF.txt");
                zipOutStream.putNextEntry(entry);
                // ファイルデータの書き込み。
                zipOutStream.write(new String("かきくけこ").getBytes());
                zipOutStream.closeEntry();
            }

            {
                final ZipEntry entry = new ZipEntry("DEF.txt");
                zipOutStream.putNextEntry(entry);
                // ファイルデータの書き込み。
                zipOutStream.write(new String("さしすせそ").getBytes());
                zipOutStream.closeEntry();
            }

            zipOutStream.finish();
        } finally {
            zipOutStream.close();
        }
    }
}

読み込み

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/**
 * ZIPファイルを読み込むサンプルです。
 * 
 * 
 * 前提条件1: ファイル名は UTF-8でエンコードされているものと仮定します。一般的に流通している
 * Windowsアーカイバで書き出された日本語ファイル名は正しく読み込めません。
 * 
 * 前提条件2: このサンプルは、CreateZipSampleが作成した
 * ZIPファイルを読み込むという仮定のもとに作られています。具体的には、読み込んだデータがテキストファイルであると仮定しています。
 */
public class ReadZipSample {
    public static void main(final String[] args) throws IOException {
        try {
            final File file = new File("zipsample.zip");
            System.out.println("ZIPファイル読込: 開始: " + file.getAbsolutePath());
            new ReadZipSample().process(file);
            System.out.println("ZIPファイル読込: 終了");
        } catch (IOException e) {
            System.out.println("ZIPファイル読込中に例外が発生しました。処理中断します:" + e.toString());
        }
    }

    /**
     * ZIPファイルを読み込みます。
     * 
     * @param file
     *            入力するZIPファイル。
     * @throws IOException
     *             入出力例外が発生した場合。
     */
    public void process(final File file) throws IOException {
        final ZipInputStream zipInStream = new ZipInputStream(
                new BufferedInputStream(new FileInputStream(file)));
        try {
            for (;;) {
                final ZipEntry entry = zipInStream.getNextEntry();
                if (entry == null)
                    break;

                System.out.println("  ファイル名: [" + entry.getName() + "]");

                // ファイルデータの読み込み。
                final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
                for (;;) {
                    int iRead = zipInStream.read();
                    if (iRead < 0)
                        break;
                    outStream.write(iRead);
                }
                outStream.flush();
                outStream.close();
                System.out.println("    内容: ["
                        + new String(outStream.toByteArray()) + "]");

                zipInStream.closeEntry();
            }
        } finally {
            zipInStream.close();
        }
    }
}

Apache Antが jarファイルをどうやって作っているのか

Apache Ant が どうやって jarファイルを作っているのか 簡単に調べてみました。

関係ない話に飛びます。こうやって ソースコードがインターネットで簡単に閲覧して指し示すことができるというのは、とても便利ですね。そのアクセスの容易さに気がついて、びっくりしました。※なお、該当箇所を検索して探し出す際には、ソースコードのアーカイブ一式を取得して検索して見つけ出しました。そういった検索は 手もとにソースコード一式がある方がやはり便利です。

Java: イメージ変換サンプル

イメージファイルを変換するサンプルです。でも、記事としては没ネタになるかも…。 ImageConverterSample.java

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.IIOException;
import javax.imageio.ImageIO;

public class ImageConverterSample {
    public static void main(final String[] args) throws IOException {
        System.out.println("イメージコンバータ: 開始");
        final File input = new File("sample.png");
        final File output = new File("sample.jpeg");
        System.out.println("  変換元: [" + input.getAbsolutePath() + "]");
        System.out.println("  変換先: [" + output.getAbsolutePath() + "]");
        new ImageConverterSample().convert(input, output);
        System.out.println("イメージコンバータ: 終了");
    }

    /**
     * イメージファイルを変換します。
     * 
     * @param input
     * @param output
     * @throws IOException
     */
    public void convert(final File input, final File output) throws IOException {
        BufferedImage bufImg = null;
        try {
            bufImg = ImageIO.read(input);
        } catch (IIOException e) {
            throw new IllegalArgumentException("ファイル["
                    + input.getAbsolutePath() + "]の読み込み処理の過程で例外が発生しました: "
                    + e.toString());
        }
        if (bufImg == null) {
            throw new IllegalArgumentException("ファイル["
                    + input.getAbsolutePath() + "]をイメージファイルとして読み込みできませんでした。");
        }

        final String outFormatName = getSuffix(output.getAbsoluteFile());
        if (ImageIO.write(bufImg, outFormatName, output) == false) {
            throw new IllegalArgumentException("ファイル["
                    + output.getAbsolutePath() + "]に 形式[" + outFormatName
                    + "]で書き込みしようとしましたが失敗しました。");
        }
    }

    /**
     * ファイル名から拡張子を取得。
     * 
     * @param file
     *            ファイル。
     * @return 拡張子。
     * @throws IllegalArgumentException
     *             ファイル名から拡張子を取得できない場合。
     */
    private static String getSuffix(final File file) {
        String name = file.getName();
        final int lastDot = name.lastIndexOf('.');
        if (lastDot <= 0) {
            // 処理できません。
            throw new IllegalArgumentException(
                    "ファイル名["
                            + file.getName()
                            + "]の拡張子が判定できませんでした。[.]が含まれないファイル名などは処理できません。[.jpeg]のような拡張子付きファイル名を指定してください。");
        }
        if (lastDot == name.length() - 1) {
            // これも処理できません。
            throw new IllegalArgumentException(
                    "ファイル名["
                            + file.getName()
                            + "]の拡張子が判定できませんでした。[.]で終わるファイル名は処理できません。[.jpeg]のような拡張子付きファイル名を指定してください。");
        }
        return name.substring(lastDot + 1);
    }
}

Java: イメージ表示シンプルサンプル

ざっくりと イメージ表示サンプルを作成してみました。ただし、これは@IT記事には掲載しないと思います。没ネタ…。 ImageViewerSample.java

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ImageViewerSample extends JPanel {
    private static final File fFile = new File("sample.png");

    private BufferedImage fImage = null;

    public ImageViewerSample() {
        // 背景色を白色にします
        setBackground(Color.white);

        try {
            fImage = ImageIO.read(fFile);
        } catch (IOException e) {
            System.out.println("イメージファイル[" + fFile.getAbsolutePath()
                    + "]の読み込みに失敗:" + e.toString());
            e.printStackTrace();
        }
    }

    public void paintComponent(final Graphics argGraphics) {
        super.paintComponent(argGraphics);

        argGraphics.drawImage(fImage, 0, 0, null);
    }

    private static void createAndShowGUI() {
        // JFrameを作成して自分自身を張り付け、これを表示します
        final JFrame frame = new JFrame("イメージ表示: " + fFile.getAbsolutePath());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new ImageViewerSample());
        frame.setLocationRelativeTo(null);
        frame.setSize(400, 400);
        frame.setVisible(true);
    }

    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

Eclipse 3.3用の Language Packは まだかなぁ…

Eclipse 3.3 用の Language Pack はまだかなぁ…


この日記について