前回はJacksonを学んだよね。ライブラリを使うことで効率的に機能を作れることが分かってもらえたかな? 今回も便利なライブラリ、その名も「Apache Commons(アパッチ・コモンズ)」について紹介していくよ!
Apache Commonsってなんだ?
Javaでプログラミングをしていると、「あれ? 標準ライブラリだと、この処理ってちょっと面倒だな…」とか「この機能、きっと他の人も欲しがってるはずなのに、なんで標準にないんだろう?」って思うことが結構あるんだ。
そんなときに役立つのが、このApache Commons! Apache Commonsは、その名の通り、世界中で使われている「Apacheソフトウェア財団」が開発している、Javaの標準ライブラリには含まれていないけど、よく使う便利な機能をまとめたライブラリ集なんだ。
例えるなら、DIYをする時に、ドライバーやペンチみたいな基本的な工具(これがJavaの標準ライブラリね)だけじゃなくて、もっと専門的な道具や、作業を効率化してくれる便利グッズ(これがApache Commons)があったら嬉しい、みたいな感じかな?
なんでApache Commonsを使うと嬉しいんだろう? 主なメリットはこれだよ。
- 開発効率アップ!:よく使うけど標準にはない処理が、短いコードで書けるようになるから、コード量も減るし、開発スピードも上がるよ。
- バグが減る!:多くの人が使っている実績のあるライブラリだから、自分で書くよりも品質が高く、バグが少ないことが多いんだ。
- 可読性が上がる!:誰が見ても「あ、あの処理ね」って分かりやすいメソッド名が多いから、コードが読みやすくなるよ。
Apache Commonsにはたくさんのモジュール(部品)があるんだけど、今回は特に利用頻度の高い「Commons Lang」と「Commons IO」に絞って、具体的な例を見ながら解説していくね!
Apache Commons Langを使ってみよう!
Commons Langは、主にJavaの基本的なデータ型(String, Numberなど)や配列、日付などの操作を便利にするためのユーティリティがいっぱい詰まったモジュールだよ。
例えば、こんな時に便利!
1. 文字列のチェック
Javaの標準機能だと、文字列がnullかどうか、空っぽかどうかをチェックするのに、ちょっと長くなりがちだよね。
Java
String str1 = null;
String str2 = "";
String str3 = " ";
String str4 = "Hello";
// 標準的なJavaでのチェック
if (str1 == null || str1.isEmpty()) {
System.out.println("str1はnullまたは空です。");
}
if (str2 == null || str2.isEmpty()) {
System.out.println("str2はnullまたは空です。");
}
// str3はスペースなのでisEmpty()はfalseになる
if (str3 == null || str3.isEmpty()) {
// これは出力されない
System.out.println("str3はnullまたは空です。");
}
// スペースを含めて空文字とみなしたい場合、さらにtrim()などの処理が必要
if (str3 == null || str3.trim().isEmpty()) {
System.out.println("str3はnullまたは空白のみです。");
}
これがCommons Langを使うと、とってもシンプルになるんだ! StringUtilsクラスを使ってみよう。
Java
import org.apache.commons.lang3.StringUtils; // これを忘れずに!
String str1 = null;
String str2 = "";
String str3 = " ";
String str4 = "Hello";
// Commons Langを使うと…
// isNullOrEmpty() は Commons Lang 2.x 系の名残。
// 今は isEmpty() または isBlank() が推奨される
if (StringUtils.isEmpty(str1)) { // null または ""
System.out.println("str1はnullまたは空です。(isEmpty)");
}
if (StringUtils.isEmpty(str2)) {
System.out.println("str2はnullまたは空です。(isEmpty)");
}
if (StringUtils.isEmpty(str3)) { // スペースなのでfalse
// これは出力されない
System.out.println("str3はnullまたは空です。(isEmpty)");
}
// isBlank() は null, "", " " (空白のみ) のどれもtrueになる!
if (StringUtils.isBlank(str1)) { // null, "", " "
System.out.println("str1はnullまたは空白のみです。(isBlank)");
}
if (StringUtils.isBlank(str2)) {
System.out.println("str2はnullまたは空白のみです。(isBlank)");
}
if (StringUtils.isBlank(str3)) {
System.out.println("str3はnullまたは空白のみです。(isBlank)"); // これがtrueになる!
}
if (!StringUtils.isBlank(str4)) {
System.out.println("str4は空でも空白でもありません。(isBlank)");
}
// 他にもいろんなチェックができるよ
System.out.println("str4が数字のみか: " + StringUtils.isNumeric(str4)); // false
System.out.println("123が数字のみか: " + StringUtils.isNumeric("123")); // true
StringUtils.isBlank()は、null、空文字列 ("")、そして空白文字 (" ") のいずれでもtrueを返してくれるから、これ1つでほとんどの空っぽチェックが済むんだ。便利だよね!
2. 数値のチェック
文字列が数値に変換可能かどうか、なんてチェックも簡単にできるよ。
Java
import org.apache.commons.lang3.StringUtils;
System.out.println("123が数値か: " + StringUtils.isNumeric("123")); // true
System.out.println("abcが数値か: " + StringUtils.isNumeric("abc")); // false
System.out.println("12.3が数値か: " + StringUtils.isNumeric("12.3")); // false (小数点が入るとfalseになる点に注意)
3. 配列の操作
配列の結合や、配列が空かどうかのチェックなんかも簡単にできるんだ。
Java
import org.apache.commons.lang3.ArrayUtils;
String[] arr1 = {"apple", "banana"};
String[] arr2 = {"orange", "grape"};
// 配列の結合
String[] combinedArr = ArrayUtils.addAll(arr1, arr2);
System.out.println("結合された配列: " + String.join(", ", combinedArr)); // apple, banana, orange, grape
// 配列が空かどうかのチェック
System.out.println("arr1は空か: " + ArrayUtils.isEmpty(arr1)); // false
System.out.println("nullの配列は空か: " + ArrayUtils.isEmpty(null)); // true
Apache Commons IOを使ってみよう!
次に紹介するのは、Commons IO! これはファイルやストリーム(データの流れ)の入出力操作を便利にするためのユーティリティが集まったモジュールだよ。ファイルの読み書きって、Java標準だと結構面倒なコードになりがちなんだけど、Commons IOを使うとびっくりするくらいシンプルになるんだ。
1. ファイルの内容を簡単に読み書き
ファイルの内容を文字列として一気に読み込んだり、書き込んだりするのも簡単!
Java
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets; // 文字コードを指定するのに使うよ
public class FileOperations {
public static void main(String[] args) {
File file = new File("test.txt"); // test.txtというファイルを作るよ
try {
// ファイルに文字列を書き込む
FileUtils.writeStringToFile(file, "Hello, Apache Commons IO!\n", StandardCharsets.UTF_8);
FileUtils.writeStringToFile(file, "これは2行目だよ。", StandardCharsets.UTF_8, true); // trueで追記モード
System.out.println("ファイルに書き込みました。");
// ファイルの内容を全て読み込む
String content = FileUtils.readFileToString(file, StandardCharsets.UTF_8);
System.out.println("ファイルの内容:\n" + content);
// ファイルを行ごとに読み込む
java.util.List<String> lines = FileUtils.readLines(file, StandardCharsets.UTF_8);
System.out.println("ファイルの内容(行ごと):");
for (String line : lines) {
System.out.println(" " + line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 使い終わったらファイルを削除(お掃除)
if (file.exists()) {
file.delete();
System.out.println("ファイルを削除しました。");
}
}
}
}
たった数行でファイルの読み書きができちゃった! Java標準のBufferedReaderやFileWriterなどを使うよりも、ずっと簡潔に書けるのがわかるかな?
2. ファイルやディレクトリのコピー・削除
ファイルやディレクトリ(フォルダ)のコピーや削除も簡単だよ。
Java
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
public class DirOperations {
public static void main(String[] args) {
File srcDir = new File("source_dir");
File destDir = new File("destination_dir");
File srcFile = new File(srcDir, "sample.txt");
try {
// ディレクトリ作成
srcDir.mkdir();
destDir.mkdir();
System.out.println("ディレクトリを作成しました。");
// ファイル作成と書き込み(内容は省略)
FileUtils.writeStringToFile(srcFile, "Hello!", java.nio.charset.StandardCharsets.UTF_8);
System.out.println("ファイルを作成しました。");
// ファイルをコピー
FileUtils.copyFileToDirectory(srcFile, destDir);
System.out.println("ファイルをコピーしました: " + new File(destDir, srcFile.getName()).exists()); // true
// ディレクトリをコピー (中にファイルがあってもOK)
File newSrcDir = new File("new_source_dir");
newSrcDir.mkdir();
FileUtils.writeStringToFile(new File(newSrcDir, "another.txt"), "Another file.", java.nio.charset.StandardCharsets.UTF_8);
FileUtils.copyDirectoryToDirectory(newSrcDir, destDir);
System.out.println("ディレクトリをコピーしました。");
System.out.println("コピー先ディレクトリの内容: " + new File(new File(destDir, "new_source_dir"), "another.txt").exists()); // true
} catch (IOException e) {
e.printStackTrace();
} finally {
// 後片付け:作成したディレクトリとファイルを削除
try {
if (srcDir.exists()) {
FileUtils.deleteDirectory(srcDir); // ディレクトリと中身を全て削除
System.out.println("source_dirを削除しました。");
}
if (destDir.exists()) {
FileUtils.deleteDirectory(destDir);
System.out.println("destination_dirを削除しました。");
}
if (newSrcDir.exists()) {
FileUtils.deleteDirectory(newSrcDir);
System.out.println("new_source_dirを削除しました。");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
ディレクトリの中身ごとコピーしたり、まるごと削除したりするのも、Java標準だと結構な手間がかかるんだけど、Commons IOを使えば1行で済んでしまうんだ。これは非常に強力だよね!
どうやって使うの?(Gradleの場合)
さて、こんな便利なApache Commons、どうやって自分のプロジェクトで使うんだろう? Javaプロジェクトの依存関係を管理するツール(GradleやMaven)を使うのが一般的だよ。
例えば、Gradleを使っているなら、build.gradleファイルにこんな風に追記するだけ!
Gradle
dependencies {
// Commons Lang 3.x を使う場合
implementation 'org.apache.commons:commons-lang3:3.14.0' // バージョンは最新のものを使ってね!
// Commons IO を使う場合
implementation 'commons-io:commons-io:2.16.1' // バージョンは最新のものを使ってね!
}
これをbuild.gradleに追加して、Gradleのリフレッシュ(または再ビルド)を実行すれば、すぐに使えるようになるよ。Mavenを使っている場合はpom.xmlに同様に記述するだけだから調べてみてね。
まとめ
今回はApache Commonsについて学んでみたよ。
- Apache Commonsは、Javaの標準ライブラリにはないけど、よく使う便利な機能をまとめたライブラリ集だよ。
- 開発効率アップ、バグの減少、コードの可読性向上といったメリットがある。
- 特に利用頻度の高い「Commons Lang」と「Commons IO」を紹介した。
- Commons Lang:文字列や数値、配列などの基本的なデータ型の操作を便利にする。
StringUtilsやArrayUtilsが有名。 - Commons IO:ファイルやストリームの入出力操作を簡単にする。
FileUtilsが有名。
- Commons Lang:文字列や数値、配列などの基本的なデータ型の操作を便利にする。
- GradleやMavenといったビルドツールを使って、簡単にプロジェクトに追加できるよ。
Apache Commonsは、Java開発の現場では非常にポピュラーなライブラリだから、ぜひ使いこなせるようになって、開発をもっと効率的に、もっと楽しくしてみてね!
次回の記事も読んでくれると嬉しいな!


コメント