top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
@ITの記事執筆のために、Javaの 圧縮・解凍APIを調べ中です。 , Eclipse 3.3言語パックを待望中…
@ITの記事執筆のために、Javaの 圧縮・解凍APIを調べ中です。
今回記事内容として扱うのは下記
java.util.zip http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/zip/package-summary.html 標準の ZIP および GZIP ファイル形式の読み込みおよび書き込み用クラス。
java.util.jar http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/jar/package-summary.html JAR (Javaアーカイブ) ファイルの読み込みおよび書き出しに使うクラス。
ああ、java.util.zipは GZIPもサポートするのですね…。今思い出しました。
さて、imageioのほうは、、、
なんか 難しそうです。
結構 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ファイルを作っているのか 簡単に調べてみました。
関係ない話に飛びます。こうやって ソースコードがインターネットで簡単に閲覧して指し示すことができるというのは、とても便利ですね。そのアクセスの容易さに気がついて、びっくりしました。※なお、該当箇所を検索して探し出す際には、ソースコードのアーカイブ一式を取得して検索して見つけ出しました。そういった検索は 手もとにソースコード一式がある方がやはり便利です。
イメージファイルを変換するサンプルです。でも、記事としては没ネタになるかも…。 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);
}
}
ざっくりと イメージ表示サンプルを作成してみました。ただし、これは@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 project downloads http://download.eclipse.org/eclipse/downloads/
http://ring.maffin.ad.jp/archives/misc/eclipse/downloads/drops/ Ring Serverからのダウンロードが高速で快適だと思います。