Tips

Apache Commons Javaプログラム演習問題 第12回

Apache Commons Javaプログラム演習問題 第12回

Apache Commons を利用した Java でのプログラム作成問題の12回目となります。

環境を構築していない場合は、概要を読み、環境を構築してから実施してください。

※この出題形式に関しては答えは1つではありません。
解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正解として下さい。

問題

jp.pjin.tech.commons.Practice012.java

package jp.pjin.tech.commons;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Practice012 {
	public static void main(String[] args) {
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;

		try {
			bis = new BufferedInputStream(new FileInputStream(new File("c:/work/src.txt")));
			bos = new BufferedOutputStream(new FileOutputStream(new File("c:/work/dest.txt")));

			byte[] buf = new byte[1024];
			int in = 0;

			while ((in = bis.read(buf)) != -1) {
				bos.write(buf, 0, in);
			}
			bos.flush();
		} catch (FileNotFoundException fnfe) {
			fnfe.printStackTrace();
		} catch (IOException ioe) {
			ioe.printStackTrace();
		} finally {
			if (bis != null) {
				try {
					bis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (bos != null) {
				try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}
}

c:\rowk\src.txtを用意してください。
中身はテキストを適当に入れます。
実行後に、dest.txtが作成され、中身がsrc.txtと同様なら正常終了しています。

かれこれ20年前くらいにjavaでのファイルコピーとして教わったコードです。
nio(FileChannel)、nio2(Files)が最近ではあるので、基本コードとして教わるか謎ですが。

上記のコードをcommonsを利用して、簡略化してください。

解答例1

jp.pjin.tech.commons.Practice012ans1.java

package jp.pjin.tech.commons;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;

public class Practice012ans1 {
	public static void main(String[] args) {
		try {
			FileUtils.copyFile(new File("c:/work/src.txt"), new File("c:/work/dest.txt"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

今まで教わっていたことは何なんだ!!って最初思いました。
例外はmai関数なので、try-catchしていますが、関数の場合は、スローして下さい。

かなりすっきりしています。
streamがないので、ファイルをsrcからdestへコピーしているという簡単なものになっています。


解答例2

jp.pjin.tech.commons.Practice012ans2.java

package jp.pjin.tech.commons;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.commons.io.IOUtils;

public class Practice012ans2 {
	public static void main(String[] args) {
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;

		try {
			bis = new BufferedInputStream(new FileInputStream(new File("c:/work/src.txt")));
			bos = new BufferedOutputStream(new FileOutputStream(new File("c:/work/dest.txt")));

			IOUtils.copy(bis, bos);

		} catch (IOException ioe) {
			ioe.printStackTrace();
		} finally {
			IOUtils.closeQuietly(bis);
			IOUtils.closeQuietly(bos);
		}

	}
}

ストリームのコピーはFileUtilsではなく、IOUtilsを利用します。
久々に書いてみたら、IOUtils#closeQuietlyが@deprecatedになっていました。
正しくは以下のようになります。

jp.pjin.tech.commons.Practice012ans3.java

package jp.pjin.tech.commons;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.commons.io.IOUtils;

public class Practice012ans3 {
	public static void main(String[] args) {
		try (
			BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("c:/work/src.txt")));
			BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("c:/work/dest.txt")));
		) {

			IOUtils.copy(bis, bos);

		} catch (IOException ioe) {
			ioe.printStackTrace();
		}

	}
}

try-with-resources文を使った場合は上記のようになります。
クローズは自動で呼ばれるので、意識しません。
なんというか、かなりすっきりしています。

apache commons

Apache Commons Javaプログラム演習問題 第23回

Apache Commons を利用した Java でのプログラム作成問題の23回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第22回

Apache Commons を利用した Java でのプログラム作成問題の22回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第21回

Apache Commons を利用した Java でのプログラム作成問題の21回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第20回

Apache Commons を利用した Java でのプログラム作成問題の20回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第19回

Apache Commons を利用した Java でのプログラム作成問題の19回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 DB環境の準備は、Apache Commons Javaプログラム演習問題 第16回をご覧ください。 ※この出題形式に関して
apache commons

Apache Commons Javaプログラム演習問題 第18回

Apache Commons を利用した Java でのプログラム作成問題の18回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 DB環境の準備は、Apache Commons Javaプログラム演習問題 第16回をご覧ください。 ※この出題形式に関して
apache commons

Apache Commons Javaプログラム演習問題 第17回

Apache Commons を利用した Java でのプログラム作成問題の17回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 DB環境の準備は、Apache Commons Javaプログラム演習問題 第16回をご覧ください。 ※この出題形式に関して
apache commons

Apache Commons Javaプログラム演習問題 第16回

Apache Commons を利用した Java でのプログラム作成問題の16回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第12回

Apache Commons を利用した Java でのプログラム作成問題の12回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第15回

Apache Commons を利用した Java でのプログラム作成問題の15回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正

Recent News

Recent Tips

Tag Search