2015-10-30

【備忘録】zip 形式で圧縮されたテキストファイルを行単位で読み込む - Java

zip 形式で圧縮されたテキストファイルを行単位で読み込むメソッドです。できることは判っていても、スクラッチから作ろうとすると、あれこれ試行錯誤するのが目に見えています。参考サイトをブックマークしておき、必要な時にそこを参照すれば良いのですが、どこにブックマークしたかを忘れることも多く、結局インターネットで探すことになります。ところが、この手の情報は豊富にあるが故に、それぞれのコーディングの仕方の違いに悩んだりして、それはそれで勉強にはなるものの、効率を落とす原因になります。

そういうわけで、自分の書き方で最低限必要な処理を用意して、それを備忘録としました。そのため、圧縮されているファイルやフォルダの個数チェックやなど、気の利いたこと一切していません。テキストファイルをそのままzip ファイルにしてあるというのが前提です。

動作を確認した環境は次の通りです。

  • OS: Fedora 22 (x86_64)
  • Java: Java SE 1.8.0_65-b17
  • IDE: NetBeans IDE 8.0.2
    void readZipFile(ZipFile zipFile) throws IOException {
        Enumeration<? extends ZipEntry> entries = zipFile.entries();
        ZipEntry entry = entries.nextElement();

        InputStream in = zipFile.getInputStream(entry);
        InputStreamReader sr = new InputStreamReader(in, "UTF-8");

        try (BufferedReader br = new BufferedReader(sr)) {
            String line = null;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        }
    }

参考サイト

  1. How to read files within a zip file - Java Tips

 

2015-10-26

Dialog とウィンドウを閉じるときのイベント処理 - 改

以前、Dialog とウィンドウを閉じるときのイベント処理 で紹介した記事ですが、確認用ダイアログのウィンドウ左上にアイコンを表示させるように少し変更しました。適当な PNG 画像を question.png というファイル名で、DialogSample.java と同じディレクトリに保存しておいてください。

Java SE 8 Update 40 より、JavaFX に DIalog が導入されたということですので、遅ればせながら Dialog のサンプルを紹介します。ウィンドウの右上の X をクリックしてウィンドウを閉じようとしたときに、確認用のダイアログを表示させるサンプルです。

動作環境は次の通りです。

  • OS: Fedora 22 (x86_64)
  • Java: Java SE 1.8.0_65-b17
  • IDE: NetBeans IDE 8.0.2
リスト:DialogSample.java 
package dialogsample;

import java.util.Optional;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.image.Image;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

public class DialogSample extends Application {

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setOnCloseRequest((WindowEvent t) -> {
            abortAction(t);
        });

        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction((ActionEvent event) -> {
            System.out.println("Hello World!");
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void abortAction(WindowEvent t) {
        Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
        alert.setTitle("確認");
        alert.setHeaderText(null);
        alert.setContentText("本当に終了しますか?");

        Stage stage = (Stage) alert.getDialogPane().getScene().getWindow();
        stage.getIcons().add(new Image(this.getClass().getResource("question.png").toString()));

        Optional<ButtonType> result = alert.showAndWait();
        if (result.get() == ButtonType.OK) {
            System.exit(0);
        } else {
            t.consume();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }

}

実行例を以下に示します。

参考サイト

  1. JavaFX 8u40 のダイアログを探る - Programming Studio
  2. JavaFX Dialogs (official) | code.makery.ch
  3. Dialog (JavaFX 8)
  4. javafx - How do you set the icon of a Dialog control Java FX/Java 8 - Stack Overflow

 

2015-10-21

Oracle、Java SE 8 Update 65 (8u65) 公開  2015年10月CPU - コトハノオト

Java SE 8u65 (CPU, クリティカルパッチアップデート)がリリースされました。

オラクルからお知らせメール (Oracle Critical Patch Update for October 2015) が来ていたのに気付かず、会社のパソコンで Java のアプリケーションを起動した時にアップデートのメッセージが出て気がつきました。

追記

今回リリースされたのは以下の二種類です。

  • 8u65:4半期毎のCritical Patch Update(CPU)
  • 8u66:CPUに加え、複数の不具合を修正する累積パッチを含むPatch Set Update(PSU)

2015-10-19

シェルスクリプトマガジン 30

POSIX 原理主義の逆襲という特集記事が目に入り、シェルスクリプトマガジン Vol. 30 (10 October 2015)(税込 540 円)を丸善で衝動買いしました。

最近はすっかり Amazon.jp のお世話になりっ放しで、書店をゆっくり見て回る機会が少なくなってしまいました。なにかの用事で書店に立ち寄った時、面白そうな雑誌に偶然出会うことがあります。今日はまさにそんな日でした。

さて、本誌の特集記事「POSIX 原理主義の逆襲」は、高汎用性で長寿命なアプリケーションを開発するにはどうすればよいか。それは、仕様が長年に亙って緩やかにしか変化せず、10 年、20 年のような長期間で通用する POSIX の仕様を厳密に守ったシェルスクリプトによるプログラミングにこそ答えがあると述べています。「原理主義」とはなかなか強烈な表現ですが、メンテナンスをほとんどする必要がなく、長期間安心して利用できるソフトウェアを作るためには、POSIX のような国際規格に従うことは確かに理にかなったやり方ではあります。

2020 年の東京オリンピックに向けて、東京メトロの経路を表示するような公共性の高いアプリを準備することを例に挙げ、如何にメンテナンスフリーのソフトウェアを作ることが重要であるかを筆者は問うていますが、それは全くその通りだと思います。

私の頭が悪いせいか、何度も読みかえして理解する必要がありました。何回も読みかえしたせいでしょうか、校正不足による誤植も目につきましたが、それでも、POISX で用意されている貧弱なコマンド群を補うため、有志により足りない機能を補強していく活動が紹介されており、シェルスクリプティングの可能性を十分に感じさせてくれる読み物でした。なお、「シェルスクリプトは書き捨て言語」なんて言われていたとは、知りませんでした。

参考サイト

  1. The Open Group Base Specifications Issue 7, 2013 Edition
  2. UEC - usp engineers' community - usp Tukubai

2015-10-17

JavaFX: NotePad 〜 ドラッグ&ドロップ

NotePad はメモ帳プログラムです。

デスクトップ用アプリケーションとしては陳腐ですが、そういった小さなアプリケーションを JavaFX で作って紹介していきたいと思い、少しずつ作り始めています。今回はその第三弾です[参考サイトのリンク]。

前述したようにいわゆるメモ帳プログラムですが、まだ全然できておらず、必要最低限の機能すら実装されていません。ただ、最初にドラッグ&ドロップの機能を試したくて、取り敢えず、その部分が出来た時点で紹介をしてしまいました。NotePad には実装してみたい機能がありますので、それらが実装できた度に紹介していきたいと思います。

開発環境は以下の通りです。

  • OS: Fedora 22 x86_64
  • jdk1.8.0_60-1.8.0_60-fcs.x86_64 (Oracle)
  • IDE: NetBeans IDE 8.0.2

実行例を以下に示しました。

ファイルの拡張子が txt あるいは log のファイルのアイコンを、ファイルマネージャ(MATE の Caja を使用しています)から NotePad の TextArea の上へドラッグしてドロップ(マウスの左ボタンを離す)すると、読み込みます。

参考サイト

  1. NotePad

【追記】GitHub では、本名で登録しています。