- PR -

JAVA言語の作法について

投稿者投稿内容
kipple
会議室デビュー日: 2005/09/20
投稿数: 6
投稿日時: 2005-09-20 18:18
はじめまして。

私、VB6とC言語の開発経験はあるのですが、
Javaは全くありません。
今後Javaでの開発を行うために自己学習を行っています。
手続き型言語の経験しかないことから、Object指向でのプログラミングを手ほどきして頂きたく書き込みさせていただきます。

ちょうどツールを作成する仕事があったため、Javaで作成してみました。
ソースを載せますのでおかしなところ、作法としてなっていないところがあったらご指摘をお願いします。

[ツールの要件]

  1. あるファイル(INファイル)からある部分を抽出し、別ファイル(OUTファイル)に書き出す。
  2. INファイルは改行で区分けされたテキストファイルである。
  3. ある部分とはあるパターン(パターン1)にマッチする行からあるパターン(パターン2)にマッチする行までである。
  4. INファイルの同一行にパターン1とパターン2は混在はしない。

[例]
パターン1:"START"
パターン2:"END"
↓入力ファイル
コード:
AAAAA
**START**
BBBBB
**END**
CCCCC
***START***
DDDDD
****END****
EEEEE


↓出力ファイル
コード:
**START**
BBBBB
**END**
***START***
DDDDD
***END***


[ソース]
コード:
import java.io.*;
import java.util.regex.*;

/**
 * @author kipple 
 * inputfilenameファイルを読み込み 
 * startREを含む行からendREを含む行までを
 * outputfilenameファイルに書き込む
 */
public class Filetest {
	private String inputfilename = "C:\\hoge\\hoge.txt";

	private String outputfilename = "C:\\hoge\\out.txt";

	private String startRE = "START";

	private String endRE = "END";

	private Pattern p1 = Pattern.compile("START");

	private Pattern p2 = Pattern.compile("END");

	public void extractfile() throws IOException {
		boolean mode = false;//出力制御フラグ
		String s = new String();
		FileReader freader = new FileReader(inputfilename);
		BufferedReader breader = new BufferedReader(freader);
		FileWriter fwriter = new FileWriter(outputfilename);
		BufferedWriter bwriter = new BufferedWriter(fwriter);

		while ((s = breader.readLine()) != null) {//EOFまで読み込み
			if (mode) {//書き込みモードか?
				bwriter.write(s + "\\n");
				if (p2.matcher(s).find()) {//終了文字列にマッチ
					mode = false;
				}
				continue;
			}
			if (p1.matcher(s).find()) {//開始文字列にマッチ
				bwriter.write(s + "\\n");
				mode = true;
			}
		}
		breader.close();
		freader.close();
		bwriter.close();
		fwriter.close();
	}

	/**
	 * @return inputfilename
	 */
	public String getInputfilename() {
		return inputfilename;
	}

	/**
	 * @param inputfilename
	 *            inputfilename を設定します。
	 */
	public void setInputfilename(String inputfilename) {
		this.inputfilename = inputfilename;
	}

	/**
	 * @return outputfilename
	 */
	public String getOutputfilename() {
		return outputfilename;
	}

	/**
	 * @param outputfilename
	 *            outputfilename を設定します。
	 */
	public void setOutputfilename(String outputfilename) {
		this.outputfilename = outputfilename;
	}

	/**
	 * @return startRE
	 */
	public String getStartRE() {
		return startRE;
	}

	/**
	 * @param startRE
	 *            startRE を設定します。
	 */
	public void setStartRE(String startRE) {
		this.startRE = startRE;
		this.p1 = Pattern.compile(startRE);
	}

	/**
	 * @return endRE
	 */
	public String getEndRE() {
		return endRE;
	}

	/**
	 * @param endRE
	 *            endRE を設定します。
	 */
	public void setEndRE(String endRE) {
		this.endRE = endRE;
		this.p2 = Pattern.compile(endRE);
	}

	public static void main(String[] args) {
		Filetest test = new Filetest();
		try {
			test.extractfile();
		} catch (IOException e) {
			System.out.println(e);
		}

	}

}


さる
ぬし
会議室デビュー日: 2005/07/14
投稿数: 276
お住まい・勤務地: 実家戻ったw
投稿日時: 2005-09-20 18:30
とりあえずtry{}catch(){}でエラーハンドリングにも挑戦だぁ〜♪
武澤
常連さん
会議室デビュー日: 2004/09/27
投稿数: 31
投稿日時: 2005-09-20 18:52
ついでにfinally句でファイルクローズするとお行儀が良いかも。
それとパターン文字のSTARTとENDが定数扱いなら、setterは必要ないのでは?
117
ベテラン
会議室デビュー日: 2005/05/09
投稿数: 94
お住まい・勤務地: 大阪府
投稿日時: 2005-09-20 18:54
見た目の話ですが、キャメル記法とか...
extractfile() → extractFile()
inputfilename → inputFileName

_________________
# Future Is On Fire !
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-09-20 19:07
> breader.close();
> freader.close();
> bwriter.close();
> fwriter.close();

try 〜 finally で入れ子にすべき。
普通に入れ子にするとネスト深すぎて CODING HORROR ですが (w

# って、先に書かれてたし... <= ちゃんと嫁

[ メッセージ編集済み 編集者: じゃんぬねっと 編集日時 2006-10-12 11:25 ]
kipple
会議室デビュー日: 2005/09/20
投稿数: 6
投稿日時: 2005-09-20 19:57
>さる 様
>武澤 様
>117 様
>じゃんぬねっと 様
返答ありがとうございます。
みなさん、興味深いご意見大変参考になります。

- try-catch-finallyについて(さる 様、武澤 様、じゃんぬねっと 様)
むむ・・
確かにストリームがオープンされっぱなしになる可能性がありますね。
自分なりに考えて修正しましたので確認していただければ幸いです。

- キャメル記法について(117 様)
確かに見やすいですね。
修正させていただきました!

- setterについて(武澤 様)
これは確かにそうなのですが、ちょっとでも汎用的に・・と思いまして
クライアント側で変更可能にしてみました。

[変更後のソース(extractFileメソッドのみ)]
コード:
public void extractFile() throws IOException {
	try{
		FileReader freader = new FileReader(inputFileName);
		BufferedReader breader = new BufferedReader(freader);
		try{
			FileWriter fwriter = new FileWriter(outputFilename);
			BufferedWriter bwriter = new BufferedWriter(fwriter);
			try {
				boolean mode = false;//出力制御フラグ
				String s = new String();
		
				while ((s = breader.readLine()) != null) {//EOFまで読み込み
					if (mode) {//書き込みモードか?
						bwriter.write(s + "\n");
						if (p2.matcher(s).find()) {//終了文字列にマッチ
							mode = false;
						}
						continue;
					}
					if (p1.matcher(s).find()) {//開始文字列にマッチ
						bwriter.write(s + "\n");
						mode = true;
					}
				}
			}
			catch (IOException e) {//読み込みもしくは書き込み時のエラー
				System.out.println(e);
			}
			finally{
				bwriter.close();
				fwriter.close();
			}
		}
		catch(IOException e){//outputFileNameオープン時のエラー
			System.out.println(e);
		}
		finally{
			breader.close();
			freader.close();
		}
	}
	catch(FileNotFoundException e){//inputFileNameオープン時のエラー
		System.out.println(e);
	}
}


kuma
大ベテラン
会議室デビュー日: 2004/02/25
投稿数: 110
投稿日時: 2005-09-20 20:12
どうせなら
breader.readLine()
をStringBufferに溜め込んでwhileを抜けた後、一気に書き出すようにしたほうが
Exceptionの個所も判別つき易くなってよくないですか?

##############################
スミマセン
>Exceptionの個所も判別つき易くなってよくないですか?
こんなこと書いたばっかりにtry-catchに視点が戻っていますね
私が言いたかったのは「BufferedWriter」を有効活用しては?
ということです。StringBufferの使用も1つの手段として例示しました。


[ メッセージ編集済み 編集者: kuma 編集日時 2005-09-20 22:36 ]
さる
ぬし
会議室デビュー日: 2005/07/14
投稿数: 276
お住まい・勤務地: 実家戻ったw
投稿日時: 2005-09-20 20:15
引用:

じゃんぬねっとさんの書き込み (2005-09-20 19:07) より:
try 〜 finally で入れ子にすべき。
普通に入れ子にするとネスト深すぎて CODING HORROR ですが (w



じゃんぬねっとさんが↑のようにおっしゃってますねぇ〜。
さあ、意味を考えよう♪

ヒント http://www.javaroad.jp/java_exception2.htm

スキルアップ/キャリアアップ(JOB@IT)